springcloud微服务治理_Erureka、Ribbon、Nacos
(内容为学习内容,不排除内容出错,若读者发现,可与作者沟通,谢谢)
服务拆分:单体按功能拆分后的单个 模块/服务。
远程调用:同一个项目中,分别在不同机器上的不同服务之间的调用
spring提供的 ,服务之间发出 http请求的工具 ——RestTemplate
- RestTemplate的注入Spring容器:需要在Spring的配置类
@Bean
//微服务调用
public RestTemplate restTemplate() { return new RestTemplate();}
- 依赖注入+远程调用
@Autowired
private RestTemplate restTemplate;
------------------------------------
String url = "http:// .....:.../../.. 需要查询的资源路径 ";
restTemplate.getForObject(url,查询资源实体类.class); //根据请求不同可使用不同方法如:putForObject
对调用的资源封装到指定位置;//order.setUser(user) //order为调用者,setUser为调用者实体类方法,user是上一步返回的结果;
Eureka
服务调用关系:服务消费者、服务提供者(角色是相对的)
Eureka注册中心:(Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。)
Eureka架构中,分两端,
- Eureka Server(记录管理监控 微服务,健康检测(检测心跳)等)
- EurekaClient(注册信息和拉取服务,每30s发送一次心跳)有分为 消息的 消费者 和 生产者
对服务信息的选择 ——使用“负载均衡算法”,来选择具体服务
Eureka 实现:EurekaServer -> EurekaClient注册 -> 服务拉取
依赖基础:spring-boot-starter-parent、spring-cloud-dependencies
一 搭建EurekaServer:
- 依赖: spring-cloud-starter-netflix-eureka-server
- 新建EurekaServer(模块)的启动类加注解:@EnableEurekaServer
- application.yml配置文件:
#1服务端口
server:
port: #eurekaServer的指定端口 #因为eureka本身也是个服务,所以要注册到集群中
spring:
application:
# 2微服务名称,将会显示在Eureka界面的应用名称列
name: eurekaClientName1
# 3Eureka服务器的地址,类型为HashMap,缺省的Key为 defaultZone;缺省的Value为 http://localhost:8761/eureka
# 如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #eurekaServer集群地址
二 erekaClient 服务 注册(2)
- 所需服务依赖:spring-cloud-starter-netflix-eureka-client
- application.yml配置文件:
server:
port: 8081 #1服务地址
spring:
application:
name: #2 eureka客户端名称
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka/ #3 eurekaServer集群地址
单服务多实例部署:IDEA中开启的服务控制台,需要的服务右击 “Copy Configuration” ,弹出的Edit Configuration中:Configuration->Environment -> VM options: -Dserver.port-端口
三 order-service服务 发现/拉取:
- 修改某服务访问其他服务地址,用服务名代替ip:
原来:String url = "http://localhost:8081/user/"+ order.getUserId();//用户id动态获取
改后:String url = "http://生产者eureka客户端名/user/"+ order.getUserId();//用户id动态获取
如:
String url = "http://userservice/user/"+ order.getUserId();//用户id动态获取 User user = restTemplate.getForObject(url, User.class); order.setUser(user);
- 在需要eureka的服务的服务的RestTemplate整合api,添加负载均衡注解:@LoadBalanced——表明此服务发出的请求将被Ribbon拦截处理
Ribbon组件
负载均衡与服务调用 实现——Ribbon组件
String url = "http://userservice/user/"+ order.getUserId()
@LoadBalanced——表明此服务发出的请求将被Ribbon拦截处理
具体实现——LoadBalancerInterceptor(接口实现ClentHttpRequestInterceptor)
负载均衡 的规则—— IRule接口
Ribbon工作流程:
IRule实现类来配置 负载均衡策略:
IRule负载均衡策略 配置:
方法1:代码实现:(作用全局)
@Bean //定义在配置中
public IRule randomRule(){ // 全局范围为 全局 对所有调用的所有服务都随机
return new RandomRule(); //将负载均衡规则设置为random
}
方法2:配置文件application.yml(针对某个服务而言)
userservice: #针对 指定微服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #NFLoadBalancerRuleClassName :规则类名称
Ribbon负载均衡 加载策略:
Ribbon默认懒加载(每次第一次发起请求时才去 创建Ribbon的 Load BalanceClient(过程中拉取))
设置饥饿加载
ribbon:
eager-load:
enabled: true #开启饥饿加载,默认false
clients: #指定饥饿加载服务名称
- userservice
- * service
Nacos的注册中心
安装包在github上。
Nacos的注册中心(原阿里产品,现springcloud组件)端口:8848 默认账号&密码:nacos
Windows命令启动:单机启动startup.cmd -m standalone
-m为模式, standalone为单机启动
Nacos配置:
- 所有服务的 父工程——添加nacos管理依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 为client服务——添加依赖:
spring-cloud-starter-alibaba-nacos-discovery
- 所有子服务配置文件:
spring
application:
name: userservice #当前服务名称
cloud:
nacos:
server-addr: localhost:8848 #服务端访问地址
Nacos服务分级存储模型:
一个服务多个实例,不能放到一个注册中心检测,实现容灾技术,服务的每个实例按地域划分为不同的 集群
服务-> 集群->实例
Nacos服务 集群 属性配置:(优先调用本地 服务集群)
在 消费者 客户端:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: #指定集群(配属到哪个集群)名称 #配置重启服务
IDEA中配2个不同集群,只需先启动第1个,后修改集群名称后,再启动另一个service;
Nacos的负载均衡策略默认为随机,如果想配置,如下
NacosRule负载均衡策略:
集群负载均衡:使得拉去服务时优先从本地集群中寻找,确定实例列表厚随后选择实例
消费者 服务中:
userservice: #对指定服务名,配置负载均衡规则
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则——优先访问本地集群(本地还是随机)
服务实例 权重负载均衡:
通过权重配置控制分频率,权重越大访问频率越高(0-1之间),可通过Nacos网页配置
Nacos——既是服务注册中心、也是数据中心,(服务数据分离——环境隔离)
为区分服务和数据——环境隔离namespace
Nacos中服务存储和数据存储最外层是一个名为namespace,用来做外层隔离;
namespace -> Group -> Service/Data(概念划分,非必须)
命名空间默认一个,在Nacos访问地址新建命名空间后(如果不手动设置ID,会自动生成一个ID)
非同一个命名空间下的服务无法相互访问——不同namespace下的服务不可见
环境隔离配置步骤:
- 网页配置命名空间,得到 命名空间ID
- 在代码中设置(拿命名空间ID),消费者客户端 修改服务application.yml:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: #集群名称
namespace: #命名空间ID
Rureka和Nacoa的共同点:
都支持注册和服务拉取、支持服务提供者心跳方式做健康检测
Rureka和Nacoa的区别:
- Nacos服务端 主动检测提供者状态:临时实例采用心跳检测,非临时实例采用主动检测
- 临时实例心跳不正常会被剔除,非临时实例不会
- Nacos支持服务列表表更的信息推送拉取(push/pull)模式(Eureka只是拉去服务信息),服务列表更新及时
- Naxos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka只支持AP方式
(心跳检测:服务提供者每隔一段时间,向注册中心发送请求)
服务的 健康检测
Nacos和Eureka,健康检测时,把服务提供者实例是否分临时实例和非临时实例(健康检测频率不一样)
消息生产者:当Nacos中,服务实例为临时实例时,健康状态变成false的话,nacos注册中心 直接剔除该服务,不再进行心跳检测(而非临时实例会)等待服务再次恢复正常状态;
消息消费者:Eureka在一定时间只采用pull服务,而nacos 不仅pull,还会做服务push推送(主动)
Nacos是否 临时实例 的配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
ephemeral: #临时实例默认true为临时实例,false
nacos集群默认采用AP方式,非临时时CP;
eureka采用AP;
Nacos(管理、注册)之 配置(服务配置文件的配置内容)管理
配置更改的热更新
服务集群的 共享配置文件内容的配置 ——通过Nacos实现
(统一配置隔离、配置热更新、配置共享、搭建Nacos集群 )
服务的统一 配置管理 服务
一 Nacos 网页配置 配置列表 ——根据组配置
共享配置文件名:DataID : 命名方式:业务名-项目运行环境(dev/pro/test)-.yaml 、
配置内容:输入 共享服务配置(配置内容:大多是 (热更新需求)变化的 配置,如开关类型
二 微服务读取Nacos 设置的共享服务配置:
bootstrap.yml :springboot引导文件,优先级高于application.yml
将有关Nacos有关的所有配置都设置到 bootstrap.yml 配置文件中
实现步骤:
- Nacos(配置管理 客户端)依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- resource下创建bootstrap配置文件:
#此内容需要和Nacos网页的console配置管理列表一致
spring:
application:
name: userservice #为共享配置的 服务名称 要与网页共享配置文件的 一致 服务要读取配置的名称
profiles:
active: dev #运行环境 要与网页共享配置文件的 一致
cloud:
nacos:
server-addr: localhost:8848 #Nacox访问地址 服务要去读取配置的地址
config:
file-extension: yaml #后缀 nacos服务端共享配置文件 后缀一致
后将服务原配置与此配置文件重复内容删除;
热更新是一种App软件开发者常用的更新方式。简单来说,就是在用户通过下载安装APP之后,打开App时遇到的即时更新。
设置共享配置的 目的 是为了 : 配置热更新
配置的热更新:
热更新实现——配置自动刷新
方式1:在(属性注入)@Value注入的变量(使用了共享配置内容的)所在类加注解@RefreshScope
方式2:使用(属性自动注入)@ConfigurationProperties(prifix=“服务端配置变量”)注解 (推荐)
多环境(运行环境) 配置共享
服务到nacos服务端会就在两种配置文件:服务名+环境+.yaml 和 服务名.yaml
多环境配置共享:利用 服务名.yaml 配置文件
当本地,nacos服务端两种配置文件 有相同配置时;
配置优先级:服务名-prifile.yml(单环境) > 服务名.yml(多环境共享) > 本地配置
Naxos集群搭建:
搭建模型:
简单搭建:
-
搭建数据库,初始化数据库表架构
-
下载安装nacos
-
配置nacos组件 节点(不同机器的nacos配置):
nacos软件 配置文件中:
集群配置:cluster.conf(去除.example)设置 集群中 每个 nacos 作为节点的 配置 :直接写: ip:端口;
修改mysql数据库配置信息+nacos服务端口:application.properties修改有关db相关内容(1.打开mysql数据源:spring.datasource.platform=mysql 2.有关 Connect URL of DB 的内容打开(删除#)并修改其他) -
启动nacos集群:集群启动:Windows系统下 单个nacal: 直接用命令行进行启动命令
-
nginx反向代理 ,nginx软件的配置文件配置:nginx/cong/nginx.conf :文件http中
#配置nacos集群(最后nginx会对IP地址做负载均衡)
upstream nacos-cluster { #集群
server 具体IP端口
server 具体IP端口
...
}
#反向代理配置
server {
#若此处配置,下次访问可用指定的IP,非nacos的8848
listen nginx端口;
server_name :nginx的IP;
#若访问 含"/nacos"路径的,就做代理到上面的服务集群中
location /nacos }
proxy_pass http://nacos_cluster;
- nginx重启
- 可直接使用 IP/nacos访问