Nacos服务发现与配置管理
服务发现
微服务架构:
特点:
1、服务层按业务拆分为一个一个的微服务。
2、微服务的职责单一。
3、微服务之间采用RESTful、RPC等轻量级协议传输。
4、有利于采用前后端分离架构。
理解服务发现:
Nacos介绍
目前服务注册中心主要有Nacos、Eureka、Consul和Zookeeper。
CAP理论: 一个分布式系统最多只能同时满足 一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance) 这三项中的两项。
C: 一致性
Nacos主要功能∶
1.服务发现与服务健康检查
Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。
2.动态配置管理
动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重亲部署应用程序,这使配置的更改更加高效和灵活。
3.动态DNS服务
Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端点,让三方应用方便的查阅及发现。
4.服务和元数据管理
Nacos能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。
安装启动
下载地址:https://github.com/alibaba/nacos/releases
启动:
Linux启动方式:
sh startup.sh -m standalone
Windows启动方式:
startup.cmd -m standalone
standalone: 表示单机模式运行,非集群模式
启动成功,浏览 http://127.0.0.1:8848/nacos,打开控制登录页面。
默认用户名:nacos,密码:nacos
启动报错:
nacos is starting with cluster
nacos is starting,you can check the /home/wenfengz/work/nacos/logs/start.out
#去 start.out 查看
-Djava.ext.dirs=/home/wenfengz/work/jdk-11/jre/lib/ext:/home/wenfengz/work/jdk-11/lib/ext is not supported. Use -classpath instead.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
原因:java路径不对
进入编辑 startup.sh 文件
vim startup.sh
#修改java路径 如: /home/user/work/jdk-11
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/work/jdk-11
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/home/user/work
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
外部数据库支持(Mysql)
- 安装数据库,5.6.5+
- 初始化mysql数据库,新建数据库nacos_config,数据库初始化文件:${nacoshome}/conf/nacos- mysql.sql.
- .修改${nacoshome}/conf/application.properties文件,增加支持mysql数据源配置(目前只支持 mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_config?
characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
若启动失败:
1.将mysql-connection-java.jar 放入${nacoshome}/plugins\mysql。
2.将 application.properties 改为 bootstrap,application。
Restful服务发现
服务提供者配置:
server:
port: 8000
spring:
application:
name: nacos_restful_provider
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
服务提供者接口代码:
@RestController
public class ProviderController {
@GetMapping(value = "/service")
public String service() {
System.out.println("provider");
return "provider";
}
}
服务消费者配置:
server:
port: 9000
#provider.address: 127.0.0.1:8000
# 服务生产方地址
spring:
application:
name: nacos_restful_consumer
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
服务消费者接口代码:
@RestController
public class ConsumerController {
@Value("${provider.address}")
private String providerAddress;
//服务id即注册中心的中的服务名
private String serviceId="nacos_restful_provider";
//负载均衡
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping(value = "/service")
public String service() {
RestTemplate restTemplate = new RestTemplate();
//调用服务
ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
URI uri = serviceInstance.getUri();
String providerResult = restTemplate.getForObject(uri+"/service",String.class);
return "consumer invoke | " + providerResult;
}
}
启动服务提供者和消费者后,可以看到
负载均衡
Ribbon是一个客户端负载均衡器,它的责任是从一组实例列表中挑选合适的实例。
如何挑选?取决于负载均衡策略 。
RoundRobinRule(默认): 轮询,即按一定的顺序轮换获取实例的地址。
RandomRule: 随机,即以随机的方式获取实例的地址。
AvailabilityFilteringRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发的连接数量 超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;
WeightedResponseTimeRule:
根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的 机率越高; 刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够时,会切换到 WeightedResponseTimeRule
RetryRule:
先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用 的服务;
BestAvailableRule:
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的 服务;
ZoneAvoidanceRule:
默认规则,复合判断server所在区域的性能和server的可用性选择服务器;
配置负载均衡策略:
在服务消费方的配置文件中,修改负载均衡策略。
#配置负载均衡策略
nacos‐restful‐provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
环境隔离
namespace: