你好,我是程序员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); }}@SpringBootApplicationpublic 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微服务实战—码闻强