关于nacos:注册中心高并发场景微服务实战九

5次阅读

共计 2744 个字符,预计需要花费 7 分钟才能阅读完成。

你好,我是程序员 Alan.

我在《文言服务治理—高并发场景微服务实战(八)》中,简略介绍了微服务常见组件性能,从本篇开始我将进一步解说各个组件的内容和利用。

服务调用的问题

在《需要剖析—高并发常见微服务实战(二)》剖析业务需要时,其中有个简略的性能点:订票服务能够申请不同的航空公司查问机票信息,订购指定航空公司航班机票。这里就波及到两个或多个服务间的调用问题。

服务调用能够简略的分为单实例状况和多实例状况。

单实例状况

能够采纳 IP + Port + 接口的模式,采纳点对点的 HTTP 间接调用。这种状况有个显著的毛病就是如果服务增多,将会造成蜘蛛网的模式,十分不利于开发保护。

多实例状况

在理论生产场景中,咱们通常会采纳多实例集群部署,来应答服务的压力。但多实例部署后,间接面临一个问题,即调用方如何通晓调用哪个实例,当实例运行失败后,如何转移到别的实例下来解决申请?此时咱们可能会抉择 Nginx 负载平衡,但往往是动态的,在服务不可用时,如何动静的更新负载平衡列表,保障调用者的失常调用呢?

面对以上两种状况,咱们须要将所有的服务对立的、动静的治理起来,此时注册核心就应运而生。

服务注册核心

服务注册核心作分布式服务框架的外围模块,要实现的性能是服务的注册、订 阅、登记、告诉。

所有的服务都与注册核心产生连贯,由注册核心对立配置管理,不再由实例本身间接调用。服务治理过程大抵过程如下图所示:

从图中,能够看到一个残缺的,服务注册和发现的过程:

1. 服务提供者启动时,将服务提供者的信息被动提交到服务注册核心进行服务注册。

2. 服务调用者启动时,将服务提供者信息从注册核心下载到调用者本地,调用者从本地的 服务提供者列表中,基于某种负载平衡策略抉择一台服务实例发动近程调用,这是一个点到点调用的形式。

3. 服务注册核心可能感知服务提供者某个实例下线,同时将该实例服务提供者信息从注册核心革除,并告诉服务调用者集群中的每一个实例,告知服务调用者不再调用本实例,免得调用失败。

从这个过程中能够看出,有了注册核心之后,服务节点的减少和缩小对于客户端就是通明的。这样,除了能够实现不重启客户端,就能动静地变更服务节点以外,还能够实现优雅敞开的性能。

Nacos 利用

目前业界有很多可供你来抉择的注册核心组件,例如 ZooKeeper,阿里的微服务注册核心 Nacos,Spring Cloud 的 Eureka 等等。我集体比拟罕用的组件是 Nacos,它的定位是一个更易于构建云原生利用的动静服务发现、配置管理和服务治理平台。

装置 Nacos

Nacos 官网地址:https://nacos.io/en-us/,本文采纳 Nacos 1.1.4 版本。

下载后解压,应用对应命令启动。

下载后解压,应用对应命令启动。

startup.cmd -m standalone

(standalone 代表着单机模式运行,非集群模式)

启动日志如下:

启动胜利后,关上 http://127.0.0.1:8848/nacos,输出默认的用户名 nacos、明码 nacos,就能够看到如下界面。

能够看到 Nacos 左侧菜单栏看到 Nacos 提供的次要性能,本次咱们只用到 Nacos 服务治理性能,其余性能前面章节再讲。

服务中利用 Nacos

本文演示如何在 Sping Boot 我的项目中启动 Nacos 的服务发现性能。

1. 增加依赖

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-discovery-spring-boot-starter</artifactId>
    <version>0.2.7</version>
</dependency>

留神:版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。

\2. 在 application.yml 中配置 Nacos server 的地址

nacos:
  discovery:
    server-addr: 127.0.0.1:8848

\3. 应用 @NacosInjected 注入 Nacos 的 NamingServerice 实例

@Controller
@RequestMapping("discovery")
public class DiscoveryController {
    @NacosInjected
    private NamingService namingService;
    @RequestMapping(value = "/get", method = GET)
    @ResponseBody
    public List<Instance> get(@RequestParam String serviceName) throws NacosException {return namingService.getAllInstances(serviceName);
    }
}
@SpringBootApplication
public class NacosDiscoveryApplication {public static void main(String[] args) {SpringApplication.run(NacosDiscoveryApplication.class, args);
    }
}

4. 启动 NacosDiscoveryApplication,curl http://localhost:8080/discove…,此时返回为空 JSON 数组 []。

5. 通过调用 Nacos Open API 向 Nacos server 注册一个名称为 example 服务

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8080'

6. 再次拜访 curl http://localhost:8080/discove…,此时返回内容为

[
  {
    "instanceId": "127.0.0.1-8080-DEFAULT-example",
    "ip": "127.0.0.1",
    "port": 8080,
    "weight": 1.0,
    "healthy": true,
    "cluster": {
      "serviceName": null,
      "name": "","healthChecker": {"type":"TCP"},"defaultPort": 80,"defaultCheckPort": 80,"useIPPort4Check": true,"metadata": {}},
    "service": null,
    "metadata": {}}
]

站在伟人的肩膀上

  • Nacos 文档
  • SpringCloud 微服务实战—码闻强
正文完
 0