服务治理:Nacos 注册中心


一、什么是服务治理

服务治理是微服务架构中最核心最基本的模块。⽤于实现各个微服务的⾃动化注册与发现。
服务注册:在服务治理框架中,都会构建⼀个注册中心,每个服务单元向注册中心登记自己提供服务的详细信息。并在注册中心形成⼀张服务的清单,服务注册中心需要以心跳的方式去监测清单中的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。
服务发现:服务调⽤方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实例的访问。

在这里插入图片描述
通过上面的调用图会发现,除了微服务,还有⼀个组件是服务注册中心,它是微服务架构非常重要的⼀个组件,在微服务架构⾥主要起到了协调者的⼀个作⽤。注册中心⼀般包含如下几个功能:

  • 服务发现
    服务注册:保存服务提供者和服务调用者的信息;
    服务订阅:服务调用者订阅服务提供者的信息,注册中心向订阅者推送提供者的信息。
  • 服务健康检测
    检测服务提供者的健康情况,如果发现异常,执行服务剔除。

二、Nacos 注册中心的核心功能 (★)

Nacos的作用就是⼀个注册中心,用来管理注册上来的各个微服务。核心功能点:

  1. 服务注册Nacos Client 会通过发送 REST 请求想 Nacos Server 注册自己的服务,提供自身的元数据,比如:IP地址,端口等信息。Nacos Server 接收到注册请求后,就会把这些元数据存储到⼀个双层的内存Map中。
  2. 服务心跳:在服务注册后,Nacos Client 会维护⼀个定时心跳来维持统治 Nacos Server,说明服务⼀致处于可用状态,防止被剔除,默认 5s 发送⼀次心跳。
  3. 服务同步:Nacos Server 集群之间会相互同步服务实例,用来保证服务信息的⼀致性。
  4. 服务发现: 服务消费者(Nacos Client) 在调用服务提供的服务时,会发送⼀个 REST 请求给 Nacos Server,获取上面注册的服务清单,并且缓存在 Nacos Client 本地,同时会在 Nacos Client 本地开启⼀个定时任务拉取服务最新的注册表信息更新到本地缓存。
  5. 服务健康检查:Nacos Server 会开启⼀个定时任务来检查注册服务实例的健康情况,对于超过 15s 没有收到客户端心跳的实例会将他的 healthy 属性设置为 false (客户端服务发现时不会发现),如果某个实例超过 30s 没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)

在这里插入图片描述
注意:当服务启动好以后,服务订阅者通过服务发现将注册中心存储的服务信息拉取到本地缓存列表,当服务间调用时,通过网络调用,而不是通过注册中心。如:订单服务向商品服务发起请求的URL:http://product-service/product/{id},而 “product-service” 则会被替换成具体的商品服务的 IP 地址(具体替换细节,后面会详细说明)。


三、Nacos 环境搭建

3.1 本地部署

step1:安装Nacos

下载官网地址: https://github.com/alibaba/nacos/releases 
下载zip格式的安装包,然后进⾏解压缩操作,上课使⽤的Nacos Server版本是1.3.2

csdn 搜索资源:nacos-server-1.3.2.zip

step2:启动Nacos

切换到 bin 目录下,并执行以下命令

startup.cmd -m standalone

3.2 服务器部署

step1:上传文件,将nacos-server-1.3.2.zip上传到/usr/local/software

step2:解压文件到指定目录

unzip /usr/local/software/nacos-server-1.3.2.zip -d /usr/local/

step3:启动nacos

sh /usr/local/nacos/bin/startup.sh -m standalone

step4:输入以下命令,查看到有nacos-server.jar进程

jps

注:服务器需要暂时关闭防火墙 systemctl stop firewalld,并可使用 firewall-cmd --state 查看防火墙状态。

具体可参考:Linux关闭防火墙命令


打开浏览器输⼊http://localhost:8848/nacos(这里演示本地),即可访问服务, 默认账号和密码都是 nacos

在这里插入图片描述


四、Nacos 应用实战

1、将商品服务注册到 Nacos

<!-- nacos客户端依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、在主类上添加@EnableDiscoveryClient注解

@SpringBootApplication
@EnableDiscoveryClient
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication .class, args);
    }
}

3、在application.yml中添加Nacos服务的地址

spring:
  cloud:
    nacos:
      discovery: 
        server-addr: localhost:8848

4、启动服务, 观察Nacos的控制⾯板中是否有注册上来的商品微服务
在这里插入图片描述

订单服务步骤同上,最终注册中心注册如下两个服务:
在这里插入图片描述

当订单服务创建订单,需要调用商品服务,代码如下(了解):

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
	@Autowired
	private OrderDao orderDao;
	@Autowired
	private DiscoveryClient discoveryClient;
	@Autowired
	private RestTemplate restTemplate;
	@Override
	public Order createOrder(Long productId, Long userId) {
        // 从nacos中获取服务地址
        List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
        ServiceInstance instance = instances.get(0);
        String url = instance.getHost() + ":" + instance.getPort();
        log.info("从nacos中获取到的微服务地址为:" + url);

        // 远程调⽤商品微服务,查询商品信息
        Product product = restTemplate.getForObject("http://" + url + "/product/" + productId, Product.class);

        log.info("查询到{}号商品的信息,内容是:{}", productId, JSON.toJSONString(product));
        // 创建订单并保存
        Order order = new Order();
        order.setUid(userId);
        order.setUsername("叩丁狼教育");
        order.setPid(productId);
        order.setName(product.getName());
        order.setPrice(product.getPrice());
        order.setNumber(1);
        orderDao.save(order);
        log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));
        return order;
    }
}

以上代码存在问题 ServiceInstance instance = instances.get(0); 代码默认商品服务只有一台机器,如果商品服务做了集群呢?显然这样做不合理,所以可以自定义访问规则:

 public Order createOrder(Long productId, Long userId) {
        // 从nacos中获取服务地址
        //⾃定义规则实现随机挑选服务
        List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
        int index = new Random().nextInt(instances.size());
        ServiceInstance instance = instances.get(index);
        String url = instance.getHost() + ":" + instance.getPort();
        log.info("从nacos中获取到的微服务地址为:" + url);
       ...
    }

效果类似如下:
在这里插入图片描述


文章参考:Java微服务商城高并发秒杀项目实战|Spring Cloud Alibaba真实项目实战+商城双11秒杀+高并发+消息+支付+分布式事物Seata

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiu Yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值