共计 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 微服务实战—码闻强