目前用的比较多的服务发现中心有:Nacos、Eureka、Consul 、Zookeeper
Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案
nacos官网地址:https://nacos.io
Nacos主要提供以下四大功能
(1)服务发现和服务健康监测
Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求
(2)动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
(3)动态 DNS 服务
Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端点,让三方应用方便的查阅级发现
(4)服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
你可以通过源码和发行包两种方式来获取 Nacos。
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
您可以从 最新稳定版本 下载 nacos-server-$version.zip
包。
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
nacos的默认端口号是8848,需要保证8848默认端口号没有被其他进程占用。
进入安装程序的bin目录:
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
或者双击startup.cmd运行文件。
启动成功,可以通过浏览器访问http://126.0.0.1:8848/nacos,进入nacos登录页面
使用默认用户名:nacos,默认密码:nacos 登录即可打开主页面
1.安装数据库,版本要求:5.6.5+ ,mysql 8以下
2.初始化mysql数据库,新建数据库nacos_config,数据库初始化文件:${nacoshome}/conf/nacos-mysql.sql
3.修改${nacoshome}/conf/application.properties文件,增加支持mysql数据源配置,添加mysql数据源url,用户名和密码
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user= #换成自己的数据库用户名
db.password = #换成自己的数据库密码
在服务提供工程中配置nacos服务发现相关配置
服务提供:
spring:
application:
name: nacos-restful-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
启动nacos
启动服务提供
观察nacos服务列表,nacos-restful-provider注册成功
在服务消费工程中配置nacos服务发现相关的配置:
服务消费:
spring:
application:
name: nacos-restful-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
修改Controller中远程调用的代码
//服务id即注册中心中的服务名
private String serviceId = "nacos-restful-provider";
//通过负载均衡发现地址,流程是从服务中心拿到nacos-restful-provider服务列表,通过负载均衡算法获取一个地址
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping(value = "/service")
public String service(){
// 远程调用
RestTemplate restTemplate = new RestTemplate();
//发现一个地址
ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
//获取一个http://开头的地址,包括ip和端口
URI uri = serviceInstance.getUri();
//调用服务
String result= restTemplate.getForObject(uri+"/service",String.class);
return "consumer invode | "+result;
}
在RESTful服务发现的流程中,ServiceA通过负载均衡调用ServiceB
负载均衡就是将用户的请求通过一定的策略,分摊在多个服务实例上执行,它是处理高并发、缓解网络压力和进行服务端扩容的重要手段之一。它分为服务端负载均衡和客户端负载均衡
服务器端负载均衡
在负载均衡器中维护一个可用的服务实例清单,当客户端请求来临时,负载均衡服务器按照某种配置好的规则(负载均衡算法)从可用服务实例清单中选取其一去处理客户端的请求。这就是服务端负载均衡。
客户端负载均衡
LoadBalancerClient就是一个客户端负载均衡器,具体使用的是Ribbon客户端负载均衡器。
Ribbon在发送请求前通过负载均衡算法选择一个服务实例,然后进行访问,这就是客服端负载均衡,即在客户端进行负载均衡的分配。
Ribbon是一个客户端负载均衡器,它的责任是从一组实例列表中挑选合适的实例,如何挑选?取决于负载均衡策略。
Ribbon核心组件IRule是负载均衡策略接口,如下实现
服务注册与发现流程:
1、服务提供方将自己注册到服务注册中心
2、服务消费方从服务注册中心获取服务地址
3、通过客户端负载均衡器进行远程调用