1.【Spring Cloud Alibaba】服务发现-Nacos
一、服务的提供者与服务的消费者
二、服务发现原理
如果用户中心地址发生变化怎么办?
服务的消费者总能找到服务的提供者的这种原理,即服务发现原理。
三、什么是Nacos?
Nacos文档地址请查看,引入Nacos,架构的演进
四、搭建Nacos Server
1、下载Nacos 下载地址
在spring-cloud-alibaba-dependencies下按住Ctrl+鼠标左键,查看Nacos组件相关的版本。
<nacos.client.version>1.0.0</nacos.client.version>
<nacos.config.version>0.8.0</nacos.config.version>
nacos-server-1.0.1是兼容nacos-server-1.0.0的,所以我这里选用nacos-server-1.0.1版本。
2、搭建Nacos Server
Nacos 快速开始
五、将应用注册到Nacos
1、将user-content注册到Nacos
pom.xml添加
<!--spring-cloud-starter-{spring cloud子项目名称}-[{模块名称}]-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml添加
spring:
cloud:
nacos:
discovery:
#指定nacos server的地址
server-addr: localhost:8848
application:
# 服务名称尽量用-,不用要_,更不要用特殊字符
name: user-center
启动服务
在此之前,你应该先启动nacos-server
登录查看注册的服务
2、将content-center注册到Nacos
按照user-center将content-center注册到Nacos
在此刷新页面,我们可以看到
3、在content-center下编写测试代码
在TestController下添加如下代码
@Autowired
private DiscoveryClient discoveryClient;
/**
* 测试:服务发现,证明内容中心可以查找到用户中心
* @return 用户中心所有地址的详细信息
*/
@GetMapping("/test2")
public List<ServiceInstance> getInstances(){
// 查询指定服务所有实例的信息
return this.discoveryClient.getInstances("user-center");
}
在浏览器下进行测试
开启用户中心多个实例进行测试
思考?如果将用户中心断开,再次刷新浏览器观察变化
六、为内容中心引入服务发现
修改ShareService
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareService {
private final ShareMapper shareMapper;
private final RestTemplate restTemplate;
private final DiscoveryClient discoveryClient;
public ShareDTO findById(Integer id){
// 获取分享的详情
Share share = this.shareMapper.selectByPrimaryKey(id);
// 发布人id
Integer userId = share.getUserId();
// 获取用户中心所有实例信息
List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
String targetURL = instances.stream()
// 数据变换
.map(instance-> instance.getUri().toString() + "/users/{id}")
.findFirst()
.orElseThrow(()-> new IllegalArgumentException("当前没有实例"));
log.info("请求的目标地址:{}",targetURL);
// 怎么调用用户微服务的users/{userId}
UserDTO userDTO = this.restTemplate.getForObject(
targetURL,
UserDTO.class,
userId
);
// 消息的装配
ShareDTO shareDTO = new ShareDTO();
BeanUtils.copyProperties(share,shareDTO);
shareDTO.setWxNickname(userDTO.getWxNickname());
return shareDTO;
}
}
测试
七、Nacos服务发现的领域模型
- Namespace:实现隔离,默认public
- Group:不同服务可以分到一个组,默认DEFAULT_GROUP
- Service:微服务
- Cluster:对指定微服务的一个虚拟划分,默认DEFAULT
- Instance:微服务实例
八、Nacos元数据
官方文档说明
元数据的作用
- 提供描述信息
- 让微服务调用更加灵活
如何为微服务设置元数据?
- 控制台方式指定
- 配置文件指定