服务治理
服务治理
RestTemplate进行服务间的相互调用是非常有问题的,如果服务备份多个服务器,进行集群服务,而且在开发阶段,我们也不知道其它服务器的地址,那这时我们将如何进行服务器之间的相互调用,我们就需要用到注册中心技术
- 服务治理中的三个角色
服务提供者
:暴露服务接口,供其他服务调用
服务消费者
:调用其它服务提供的接口
注册中心
:记录并监控微服务各个实例状态,推送变更信息
注册中心
服务提供者会在启动的时候注册自己信息到注册中心,消费者可以从注册中心订阅和拉取服务信息
我的理解:在现在一个服务备份多个分布在多台服务器上,当多个服务启动就将自己挂到注册中心,共消费者选择,起到一个公共黑板墙的作用
- 消费者符合得知服务状态变更
服务提供者通过心跳机制向注册中心报告自己的健康状态,当心跳异常时注册中心会将异常服务剔除,并通知订阅了该服务的消费者
- 多个实例,消费者如何选择
消费者可以通过负载均衡算法,从多个实例中选择一个
那么如何实现注册中心,下面提到注册中心技术Nacos
Nacos注册中心
Nacos是目前国内企业中占比最多的注册中心组件,它是阿里巴巴的产品,目前已经存在于SpirngCloudAlibaba中
服务注册
如何将服务注册到注册中心当中:
- 引入依赖
nacos discovery
java
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置Nacos地址
yml
spring:
application:
name: 服务名称(项目名)
cloud:
nacos:
server-addr: 192.168.75.135:端口 #nacos地址
服务发现
消费者需要连接nacos以拉取和订阅服务
- 引入nacos discovery依赖
java
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置nacos地址
yml
spring:
application:
name: 服务名称(项目名)
cloud:
nacos:
server-addr: 192.168.75.135:端口 #nacos地址
- 服务发现
java
private final DiscoveryClient discoveryClient;
private void handleCartItems(List<CartVO> vos){
//根据服务名称,拉取服务的实例列表
List<ServiceInstance> instances =discoveryClient.getInstances("服务名称");
//负载均衡,挑选一个实例
ServiceInstance instance=instances.get(RandomUtil.randomInt(instances.size()));
//获取实例的IP和端口
URI uri=instance.getUri();
//拿到位置之后再通过RestTemplate进行访问
}