Eureka、Ribbon、Nacos
1. Eureka基础知识
一个服务既可以是消费者,也可以是提供者
Eureka服务注册与发现
- 什么是服务注册
- Eureka采用CS的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心,而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接,这样系统的维护人员就可以通过Eureka Server来监控各个微服务是否正常运行
- 在服务注册于发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的通讯地址,然后在实现本地RPC调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理理念)。在任何RPC远程框架中,都会有一个注册中心
- Eureka包含两个组件:Eureka Server和Eureka Client
- Eureka Server提供服务注册服务
- 各个微服务节点通过配置启动后,会在EurekaServer中注册,这样EurekaServer中的服务注册表中将会存储所有 可用服务节点的信息,服务节点的信息可以在界面中直观看到
- Eureka Client通过注册中心进行访问
- 是一个java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期30s)。如果Eureka Server在多个心跳周期内没有接受到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90s)
- Eureka Server提供服务注册服务
服务提供者:注册服务信息给注册中心
服务消费者:从注册中心中找到服务信息
其中注册中心实现负载均衡
2. Eureka注册中心:
2.1 搭建EurekaServer
·引入eureka-server依赖
·添加@EnableEurekaServer注解·在application.yml中配置eureka地址
2.2.服务注册
.引入eureka-client依赖
·在application.yml中配置eureka地址
2.3.服务发现
·引入eureka-client依赖
·在application.yml中配置eureka地址
·给RestTemplate添加@LoadBalanced注解·用服务提供者的服务名称远程调用
多开:
-Dserver.port=8082
Ribbon
负载均衡
调整负载均衡,修改Application
调整为随机
@MapperScan("cn.itcast.user.mapper")
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
@Bean
public IRule randomRule(){
return new RandomRule();
}
}
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
application.yml
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: #指定饥饿加载的服务名称
- userservice
Nacos注册中心
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高
1. 服务注册到Nacos
在主工程中添加:(保证版本一致)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
需要注释掉eureka的依赖
并添加nacos的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
nacos的配置属于Spring的配置,在application.yml中写在spring下
2. 服务多级存储模型
3.Nacos 集群负载均衡
需要给order-service设置集群属性
要修改nacos的负载均衡只需要修改配置:
userservice: #要做配置的微服务名称
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
达到优先选择本地机群、且随机
4.Nacos服务实例的权重设置
根据权重负载均衡
使服务器好的承受更多的请求
而之前的配置是随机分配,不管服务器的好坏,有可能导致服务器奔溃
Nacos提供了根据权重配置来设置访问频率
在浏览器中修改权重
如果失败,报错五百则需要删除nacos目录下的data、log、status三个目录
5. Nacos 环境隔离
namespace
Nacos为了做数据的管理,添加了隔离的概念
Nacos中服务存储和数据储存的最外层都是一个名为namespace的东西,用来做最外层隔离
内部有一个group的属性:
- Service
- Data
- 集群、实例
我们的环境隔离就是对服务隔离
新建命名空间
将id配置进namespace
即可找到
此时已经将dev和public相分离,order不再能访问user
6.Nacos和Eureka的区别
nacos:
- 非临时:主动询问一段时间进行检测,不会剔除,只会标记不健康(亲生的)
- 临时:心跳检测,需要主动发送消息
配置方式:
spring:
cloud:
nacos:
discovery:
ephemeral: false #设置为非临时实例
关闭项目后,会报红,但是不会剔除
7. Nacos实现配置管理
7.1 统一配置管理
为什么要进行统一配置管理: 我们在微服务调整时,不可能挨个的修改服务器配置,同时,重启也会给我们造成极大的时间成本和风险,因此我们需要统一配置管理
配置更改热更新
+号添加配置,DataId即使名称
不是所有的配置都需要加入,只需要核心配置
项目启动--------->读取本地配置文件application.yml----------->创建spring容器---------->加载bean
当我们有nacos时:读取本地配置文件application.yml会合并
bootstrap.yml比application.yml更加优先
引入nacos的配置管理客户端依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件
7.2 配置热更新
即:修改后立刻修改,微服务无需重启
方法一:需要在controller上添加@RefreshScope
方法二:使用@ConfigurationProperties注解(推荐!!!!!!!!!!)
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
7.3 配置共享
多环境配置共享:
微服务启动时会从nacos读取多个配置文件:
- [spring-application.name]-[spring-profiles-active].yaml 例如: userservice-dev.yaml
- [spring-application.name].yaml 例如: userservice.yaml
以nacos的配置为准,本地小于nacos配置
而服务名-profiles.yaml>服务名.yaml
7.4 搭建Nacos集群
Nacos生产环境下一定要部署为集群,满足生产需要
-application.name]-[spring-profiles-active].yaml 例如: userservice-dev.yaml
- [spring-application.name].yaml 例如: userservice.yaml
以nacos的配置为准,本地小于nacos配置
而服务名-profiles.yaml>服务名.yaml
7.4 搭建Nacos集群
Nacos生产环境下一定要部署为集群,满足生产需要