服务治理
1.注册中心原理
服务治理中有三个角色:
- 服务提供者:暴露服务接口,供其他服务调用
- 服务调用者:调用其他服务提供的接口
- 注册中心:记录并监控微服务各实例状态,推送服务变更信息
解决了哪些问题
- 服务的调用者不知道该调用谁,只需要找到注册中心,他就会告诉你,额日期额还能告诉你一堆让你挑(==负载均衡==)

- ==有的服务挂了呢==,服务(微服务)提供者不仅要注册到注册中心,还要与注册中心之间形成心跳续约(定期向注册中心发请求,证明我还活着),如果不跳了,注册中心也会把你从这个服务列表中去掉,注册中心会推送变更。

注册中心原理总结
消费者如何得知服务状态变更?
- 服务提供者通过心跳机制向注册中心报告自己的健康状态,当心跳异常时注册中心会将异常服务剔除,并通知订阅了该服务的消费者
当提供者有多个实例时,消费者该选择哪一个?
- 消费者可以通过负载均衡算法,从多个实例中选择一个
当然了,自己实现注册中心还是有难度的,我们不需要自己实现,因为有很多框架已经为我们实现了==Nacos注册中心==
2.Nacos注册中心
2.1Nacos组件
他作为一个注册中心,肯定是一个独立的服务对不对,将来我们的微服务就会关联向他去注册自己。
我们用Docker部署
1 2 3 4 5 6 7 8
| docker run -d \ --name nacos \ --env-file ./nacos/custom.env \ -p 8848:8848 \ -p 9848:9848 \ -p 9849:9849 \ --restart=always \ nacos/nacos-server:v2.1.0-slim
|
2.2服务注册
步骤:
- 引入nacos依赖
1 2 3 4 5
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
|
- 配置nacos地址
1 2 3 4 5 6
| spring: application: name: item-service cloud: nacos: server-addr: 192.168.150.101:8848
|
2.2 服务发现
步骤:
- 引入nacos discovery依赖
…
- 配置nacos地址
…
- 服务发现(需要去nacos获取服务列表)nacos提供了一个API DiscoveryClient
1 2 3 4 5 6 7 8 9 10 11
| private final DiscoveryClient discoveryClient;
private void handleCartItems(List<CartVO> vos) { List<ServiceInstance> instances = discoveryClient.getInstances("item-service"); ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size())); URI uri = instance.getUri(); }
|
好的以下是完成上一期使用写死的域名进行补充:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| List<ServiceInstance> instances = discoveryClient.getInstances("item-service"); if (CollUtils.isEmpty(instances)){ return; }
ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size())); URI uri = instance.getUri();
ResponseEntity<List<ItemDTO>> response = restTemplate.exchange( uri + "/items?ids={ids}", HttpMethod.GET, null, new ParameterizedTypeReference<List<ItemDTO>>() { }, Map.of("ids", CollUtil.join(itemIds, ",")) );
if (!response.getStatusCode().is2xxSuccessful()){ return; } List<ItemDTO> items = response.getBody(); if (CollUtils.isEmpty(items)) { return; }
|


海林小盆友
小盆友
本文采用 CC BY-NC-SA 4.0 许可协议