Eureka注册中心
Eureka作为一个注册中心,服务提供者把服务注册到注册中心,服务消费者去注册中心拉取信息, 然后通过负载均衡得到对应的服务器去访问。
服务提供者每隔30s向注册中心发送请求,报告自己的状态,当超过一定时间没有发送时,注册中心会认为该服务宕机,会把它剔除。
创建Eureka服务
需要自己手动编写这个程序和导入依赖
server:port: 10086 #端口设置spring:application:name: eureka-server #服务名称eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eurekaregister-with-eureka: true # false表示不向注册中心注册自己。fetch-registry: false # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies>
创建服务注册
往服务提供者的依赖里面加入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在配置文件里面加入如下内容用于连接注册中心将并自己注册进去
spring:application:name: userservice
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka
服务拉取和负载均衡
将直连方式改成使用服务名进行连接,会根据负载均衡策略进行选择服务提供者
@LoadBalanced是Spring Cloud中提供的一个注解,它用于将一个RestTemplate对象标记为支持负载均衡的,从而可以针对服务名称进行REST调用。
负载均衡
轮询、权重、区域划分、随机,最小连接数、最少负载等
注意:不能有两种负载均衡方式,会出现不知道匹配哪一个方式而报500错误
自定义负载均衡
IRule是负载均衡的核心算法类,若未定义是用什么算法,默认使用轮询RoundRobinRule
里面包括7种算法提供使用(若不想使用这7种算法,可以自定义算法)
可以通过javaBean,也可以通过配置文件
通过javaBean是全局配置,通过配置文件是指定某一个服务配置
@Bean
public IRule randomRule(){return new RandomRule();
}
写在服务调用者中
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:eager-load:enabled: trueclients: userservice # 指定被调用微服务饥渴加载
Ribbon是什么
Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的框架。
Nacos注册中心
相比于Eureka在市面上更流行
在父工程中引入阿里巴巴的依赖
通过导入此依赖,你在项目中直接使用Spring Cloud Alibaba的其他组件时,只需声明组件的groupId和artifactId,而无需指定版本号,因为版本管理已经由这个BOM统一处理。
<dependencyManagement>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>
在需要被注入的工程中加入这个依赖
该依赖包含了自动配置的类,可以在Spring Boot应用中自动配置Nacos作为服务发现的组件。这意味着你无需手动编写大量的配置代码,Spring框架会在应用启动时自动读取Nacos的配置信息,帮助你的服务注册到Nacos服务列表中,并能够发现和调用其他已注册的服务。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在被注册到nacos中的工程添加配置信息
spring:cloud:nacos:server-addr: localhost:8848
集群策略
能访问同集群下的服务,则不会访问其他集群下的服务,只有该集群下没有服务,才会访问其他的集群下的服务
集群访问方式有两种方式
一种是配置文件进行配置
userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
一种是全局配置(使用java代码进行配置)
@Beanpublic IRule nacosRule(){return new NacosRule();}
但是NacosRule是同集群内随机挑选,不会考虑机器的性能问题。
因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
环境隔离
- nacos中可以有多个namespace
- namespace下可以有group、service等
- 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
创建命名空间
给微服务配置命名空间,将服务调用者设置到另一个命名空间,两个命名空间相互隔离,因此,服务调用者调用不到另一个命名空间的服务提供者了
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
结果
Nacos与Eureka的区别
Nacos的服务实例分为两种l类型:
- 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
- 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
spring:cloud:nacos:discovery:ephemeral: false # 设置为非临时实例
非临时服务实例宕机后,不会从nacos中进行删除
Nacos的整体过程
1. Nacos与eureka的共同点
-
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
2. Nacos与Eureka的区别
-
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
Nacos的集群采用的模式:
Nacos是Alibaba的产品,支持AP和CP模型,Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;
AP和CP仅存在于微服务中
AP指的是可用性,指的是在节点N1上进行写操作的时候,N2可以继续进行其他操作,但是这样的话就违背了一致性
CP指的是一致性,指的是在节点N1上进行写操作的时候,N2可以不继续进行其他操作,必须保持数据一致,因此就违背了可用性。