注册中心
在微服务远程调用的过程中,包括两个角色:
服务提供者:提供接口供其它微服务访问,比如
item-service
服务消费者:调用其它微服务提供的接口,比如
cart-service
在大型微服务项目中,服务提供者的数量会非常多,为了管理这些服务就引入了注册中心的概念。
三大角色:
- 服务提供者:暴露服务接口,供其它服务调用
- 服务消费者:调用其它服务提供的接口
- 注册中心:记录并监控微服务各实例状态,推送服务变更信息
消费者如何知道提供者的地址:
- 服务提供者会在启动时注册自己的信息到注册中心,消费者可以从注册中心订阅和拉取服务信息
消费者如何得知服务状态变更:
- 服务提供者通过心跳机制向注册中心报告自己的健康状态,当心跳异常时注册中心会将异常服务剔除,并通知订阅了该服务的消费者
当提供者有多个实例,消费者该选择哪个:
- 消费者通过负载均衡算法,从多个实例中选择一个
Nacos注册中心
虚拟机内配置nacos镜像;
在pom文件内配置依赖;
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置.yaml文件;
spring:
application:
name: item-service # 服务名称
cloud:
nacos:
server-addr: 192.168.66.130:8848 # nacos地址
服务发现
消费者需要连接nacos拉取和订阅服务,因此服务发现的前两步与服务注册是一样,后面再加上服务调用即可:
① 引入nacos discovery依赖
② 配置nacos地址
③ 服务发现,依靠 :private DiscoveryClient discoveryClient;
// 1.获取商品id
Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
// 2.查询商品
// 2.1 利用RestTemplate 发起http请求,得到http的响应
List<ServiceInstance> instances = discoveryClient.getInstances("item-service");
if(CollUtils.isEmpty(instances)){
return;
}
//2.2 手写负载均衡,从服务列表中挑选一个实例
ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));
//2.3 利用RestTemplate发起http请求,得到http响应
ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
instance.getUri() + "/items?ids={ids}",
HttpMethod.GET,
null,
new ParameterizedTypeReference<List<ItemDTO>>() {},
Map.of("ids", CollUtils.join(itemIds, ","))
);