一, 服务的提供者与服务的消费者
二, 服务发现原理
如果用户中心地址发生变化怎么办?
服务的消费者总能找到服务的提供者的这种原理, 即服务发现原理.
三, 什么是 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.YAML 添加
- 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 元数据
官方文档说明
元数据的作用
提供描述信息
让微服务调用更加灵活
如何为微服务设置元数据?
控制台方式指定
配置文件指定
来源: https://www.cnblogs.com/xjknight/p/12349085.html