eureka注册中心
eureka作为一个注册中心,服务提供者把服务注册到注册中心,服务消费者去注册中心拉取信息, 然后通过负载均衡得到对应的服务器去访问。
服务提供者每隔30s向注册中心发送请求,报告自己的状态,当超过一定时间没有发送时,注册中心会认为该服务宕机,会把它剔除。
创建eureka服务
需要自己手动编写这个程序和导入依赖
server:
port: 10086 #端口设置
spring:
application:
name: eureka-server #服务名称
eureka:
client:
service-url:
defaultzone: http://127.0.0.1:10086/eureka
register-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: true
clients: 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代码进行配置)
@bean
public irule nacosrule(){
return new nacosrule();
}
但是nacosrule是同集群内随机挑选,不会考虑机器的性能问题。
因此,nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
环境隔离
- nacos中可以有多个namespace
- namespace下可以有group、service等
- 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
创建命名空间
给微服务配置命名空间,将服务调用者设置到另一个命名空间,两个命名空间相互隔离,因此,服务调用者调用不到另一个命名空间的服务提供者了
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: hz
namespace: 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可以不继续进行其他操作,必须保持数据一致,因此就违背了可用性。
发表评论