文章目录
一、什么是注册中心
注册中心是微服务架构中的一个重要组件,用于服务的注册和发现
主要作用为
1.服务注册:服务实例启动时将自身信息注册到注册中心,包括服务名称、地址端口等
2.服务发现:消费者向注册中心查询服务,并获取服务实例信息来访问服务
3.服务健康检查: 注册中心定期检查服务实例监控状况,过滤不健康的实例
4.服务路由: 提供服务的路由与负载均衡功能
5.服务监控:统计服务调用次数,时长等,用于监控服务状态
6.服务更新:当服务实例信息变更时,向注册中心发送更新信息通知
通过注册中心,服务提供者和消费者只需和注册中心交互即可,从而实现服务的注册与发现,降低了服务间的耦合度。
二、注册中心的实践
1.交互流程
服务中心通常有两个角色
1.服务提供者(生产者):对外提供服务的微服务应用,它会把自己的服务地址注册到注册中心,以供消费者发现和调用
2.服务调用者(消费者):调用其它微服务的应用程序,他会向注册中心订阅自己需要的服务,并基于服务注册者的信息发起远程调用。
2.1 生产者实现
分为三步
1.添加对应的依赖
2.配置yml文件中nacos信息
3.提供调用接口
2.1.1
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.1.2
配置nacos信息
spring:
application:
name: nacos-discovery-abc # Nacos 服务名(很重要,命名不用使用“_”)
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
ephemeral: false # 设置此服务为永久实例
# group: TEST_GROUP
server:
port: 0 # 动态端口
这里使用动态端口 因为消费者调用时无需关注端口号 注册中心会自动处理
2.1.3 编写调用端口
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private ServletWebServerApplicationContext context;
@RequestMapping("/getnamebyid")
public String getNameById(Integer id) {
return "provider-name-" + id +
" | port:" + context.getWebServer().getPort();
}
}
这里获取端口号用到了ServletWebServerApplicationContext的getWebServer().getPort()方法
2.1.4 测试
启动项目 当然我们也可以注册多个生产者 可以通过new一个模块的方式 也可以直接复制配置
全部启动
启动之后这里就会显示 这里有四个实例是因为我之前有一个实例停止了又重新启动 而这个实例是永久实例 因为是动态端口号重启之后的实例被看做一个新的 而之前的永久实例也不会消失 关于临时实例和永久实例下文会有说明
测试编写的方法是否可以调通
没有问题
2.2 消费者实现
注册中心消费者的实现比生产者要复杂一些,首先是消费者要调用生产者的HTTP接口,需要引入Spring Cloud OpenFeign进行HTTP调用,其次为了实现负载均衡,我们还需要添加客户端负载均衡器Spring Cloud LoadBalancer。
分为5步
1.添加依赖
2.配置nacos信息
3.开启Openfeign
4.编写Openfeign调用代码
5.通过Openfegin调用生产者
2.2.1. 添加依赖
总共添加三个依赖:Nacos注册中心、Openfeign和Spring Cloud LoadBalancer,.如下配置所示:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2.2. 配置nacos
spring:
application:
name: nacos-consumer-demo
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
register-enabled: false # 消费者(不需要将此服务注册到nacos)
server:
port: 8080
这里就使用的固定端口号 因为我们需要自己主动去访问
2.2.3.开启Openfeign
在启动类上加上注解
@SpringBootApplication
@EnableFeignClients // 开启 OpenFeign
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
2.2.4.编写调用代码
@Service
@FeignClient("nacos-discovery-abc") // 表示调用 nacos 中的 nacos-discovery-abc 服务
public interface UserService {
@RequestMapping("/user/getnamebyid") // 调用生产者的"/user/getnamebyid"接口
public String getNameById(@RequestParam("id") int id);
}
这里的nacos-discovery-abc一定要和生产者的名字相同才能调用成功
2.2.5 通过Openfegin调用生产者
@RestController
public class BusinessController {
@Autowired
private UserService userService;
@RequestMapping("/getnamebyid")
public String getNameById(Integer id){
return userService.getNameById(id);
}
}
2.2.6 测试
通过本地的8080端口成功访问到了生产者提供的接口
3.参数说明
重要参数说明:
1.分组:注册服务所在的组名,默认是DEFAULT_GROUP,例如:研发小组,测试小组等。
2.保护阈值:健康节点要求的最小百分比。用于在服务出现不健康实例时,阻止流量过度向少量健康实例集中保护服务的整体可用性。保护阈值应设置为一个0到1之间的浮点数,默认值为0。当集群中的健康实例占比,小于设置的保护阈值时,就会触发阈值保护功能。触发保护阈值后,Ncos会将全部实例(健康实例+非健康实例)返回给调用者,虽然可能会损失一部分流量,但能保证集群中剩余的健康实例能正常工作。
3.服务路由类型:用于实现不同的路由需求,常见的路由类型有以下两种:
none:默认路由,基于权重的轮询负载均衡路由策略。
label:标签路由,相同标签的实例会被聚合为一个集群,不同标签则实现流量隔离。
4.临时实例:Ncos中的实例分为临时实例和永久实例(也叫持久实例),临时实例的生命周期和服务的运行周期相同,服务停止运行Ncos中就会将临时实例删除;而永久示例即时程序终止,也会保留在Nacos中。在配置文件中通过:spring.cloud.nacos.discovery.ephemeral==true设置。
5.权重:用于实现负载均衡,取值范围0到10000,数值越大,权重越大,负载均衡被分配的概率也就越高。设置为0的时候表示下线。
4.临时实例与永久实例
永久实例(persistent instance)和l临时实例(ephemeral instance)是注册中心的两种不同的服务类型。
1.永久实例(Persistent Instance)是指注册到Nacos的服务实例,其注册信息会一直保留在Nacos服务器上,直到主动注销或被删除。这意味着即使服务实例下线或不可用,它的注册信息仍然会保留在Ncos上,直到显式取消注册。永久实例适用于需要长期存在的服务,比如稳定部署的服务或长时间运行的后端服务。
2.临时实例(Ephemeral Instance)是指注册到Nacos的服务实例,其注册信息在实例下线或不可用时会自动被删除。如果服务实例下线、断开连接或主动注销,Ncos会自动从注册表中删除这些实例的信息。临时实例适用于临时性的服务实例,比如临时加入集群的短期任务或特定场景下的临时服务
5.监控监测机制
Ncos中的健康检测机制是用来检查服务健康状态的,只有健康的节点才会被服务消费端调用,这样才能保证程序稳定、正常的运行。
Nacos中提供了两种健康检测的机制:
1.客户端主动上报(健康状态的)机制。
2.服务器端反向探测(健康状态的)机制。
而Ncos中的两种服务实例分别对应了两种健康检查机制:
1.临时实例(也可以叫做非持久化实例):对应的是客户端主动上报机制。
2.永久实例(也可以叫做持久化实例):服务端反向深测机制。