服务治理介绍
服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。
服务注册:在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服 务的详细信息。并在注册中心形成一张服务的清单,服务注 册中心需要以心跳的方式去监测清单中 的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。
服务发现:服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实 例的访问。
通过上面的调用图会发现,除了微服务,还有一个组件是服务注册中心,它是微服务架构非常重要 的一个组件,在微服务架构里主要起到了协调者的一个作用。
常见的注册中心
Zookeeper zookeeper 是一个分布式服务框架,是Apache 的一个子项目,它主要是用来解决分布式 应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用 配置项的管理等。
Eureka Eureka是Spring Cloud 微服务框架默认的也是推荐的服务注册中心,由 Netflix 公司与 2012 将其开源出来,主要作用就是做服务注册和发现。但是现在已经闭源,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。
Nacos Nacos 是阿里巴巴最新开源的项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring Cloud Alibaba组件之一,负责服务注册发现和服务配置。
nacos
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速 实现动态服务发现、服务配置、服务元数据及流量管理。 从上面的介绍就可以看出,nacos 的作用就是一个注册中心,用来管理注册上来的各个微服务。
搭建 nacos 环境
第 1 步: 安装 nacos 下载地址: https://github.com/alibaba/nacos/releases 下载 zip 格式的安装包,然后进行解压缩操作
第 2 步: 启动 nacos #切换目录 cd nacos/bin #命令启动 startup.cmd -m standalone
第 3 步: 访问 nacos 打开浏览器输入 http://localhost:8848/nacos,即可访问服务,默认密码是nacos/nacos
接下来在微服务的总体的xml中配置dependence
1 在 pom.xml 中添加 nacos 的依赖
<!--nacos 客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2 在启动类上添加@EnableDiscoveryClient 注解
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com.ffyc.springcloudshop.dao")
public class ShopUserApplication {
public static void main(String[] args) {
SpringApplication.run(ShopUserApplication.class);
}
}
3 在 application.yml 中为每个微服务定义服务名,并添加nacos 服务的地址
spring:
application:
name: service-user #服务名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #nacos 地址
4 启动服务, 观察 nacos 的控制面板中是否有注册上来的商品微服务
服务调用
使用 nacos 客户端根据服务名动态获取服务地址和端口
@Autowired
DiscoveryClient discoveryClient;
//使用注册中心的客户端,通过服务名去注册中心找服务 服务的获取和调用ServiceInstance productService = discoveryClient.getInstances("service-product").get(0);ServiceInstance userService = discoveryClient.getInstances("service-user").get(0);Product product = restTemplate.getForObject("http://"+productService.getHost()+":"+productService.getPort()+"/product/get/"+pid, Product.class);User user = restTemplate.getForObject("http://"+userService.getHost()+":"+userService.getPort()+"/user/get/"+uid, User.class);
附加原本之间的服务相互调用是
//查询商品,查询用版本1 // 使用地址直接调用接口
//地址变了得改代码 ,多个服务负载均衡不了,不知道调用哪一个Product product = restTemplate.getForObject("http://127.0.0.1:8091/product/get/"+pid, Product.class);User user = restTemplate.getForObject("http://127.0.0.1:8081/user/get/"+uid, User.class);
其他
手动的restTemlate与nacos比较
1. 自动注册与发现,无需手动维护地址
- RestTemplate 的痛点:调用方需硬编码目标服务的 IP 和端口(如
http://localhost:8081/api/xxx
),若服务实例动态扩缩容或部署位置变更,需手动修改地址,维护成本高。 - Nacos 的优势:
- 服务启动时自动向 Nacos 注册实例(包含 IP、端口、健康状态等信息)。
- 调用方通过服务名(如
service-order
)而非具体地址调用,Nacos 动态返回可用实例列表,无需人工干预。 - 案例:当订单服务扩展到 3 个实例时,Nacos 会自动将新实例加入列表,调用方无需修改代码。
2. 动态路由与负载均衡:流量均匀分配
- RestTemplate 的痛点:需手动实现负载均衡(如轮询 IP 列表),或集成 Ribbon 等组件,配置复杂。
- Nacos 的优势:
- 内置负载均衡策略(如权重轮询、随机、一致性哈希),可根据实例权重、负载状态动态分配流量。
- 支持基于元数据的路由(如根据机房、版本号筛选实例),满足灰度发布等场景。
- 示例:通过 Nacos 配置,让新版本服务实例优先接收 20% 流量,实现平滑升级。
二、服务健康管理:自动剔除故障实例
1. 实时健康检查,保障调用可靠性
- RestTemplate 的痛点:无法自动感知服务实例的故障,可能持续向不可用实例发送请求,导致调用失败。
- Nacos 的优势:
- 支持 TCP、HTTP、MySQL 等多种健康检查方式,定期检测实例状态。
- 发现故障实例时自动标记为 “不健康”,暂时从路由列表中剔除,避免流量流入。
- 场景:当某订单服务实例因内存溢出崩溃时,Nacos 会立即停止向其转发请求,保证调用成功率。
2. 故障恢复自动感知
- 当故障实例重启或恢复后,Nacos 会重新将其加入可用列表,无需人工干预。