介绍:
Eureka和Nacos都是服务发现和配置管理的解决方案,它们有一些共同点,也有一些不同之处。
共同点:
- 都支持服务注册和服务拉取:Eureka和Nacos都支持服务提供者将自己的服务信息注册到注册中心,服务消费者可以从注册中心拉取服务信息。
- 都支持服务提供者心跳方式做健康检测:Eureka和Nacos都会定期检测服务提供者的健康状态,以确保服务可用。
不同点:
- 心跳检测机制:Eureka对服务提供者是每30秒一次心跳检测来检测服务健康,而Nacos则把服务分为临时服务和非临时服务,对于临时服务,Nacos采取策略与Eureka相同,对于非临时服务,Nacos不会对其进行心跳检测,而是会主动调用该服务查看是否正常,若不正常会把该服务标记为不健康,但不会把该服务从服务列表中去掉。
- 数据推送方式:Eureka会定时向注册中心拉取服务,如果不主动拉取服务,注册中心不会主动推送。而Nacos中注册中心会定时向消费者主动推送信息,这样就会保持数据的准时性。
- 集群模式:Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;而Eureka采用AP方式。
- 功能丰富度:Nacos除了提供服务注册与发现外,还涵盖了动态配置管理、服务健康监测等多方面功能,而Eureka则主要关注服务注册和发现,不包含动态配置管理功能。
一 Eureka搭建流程
1.搭建注册中心
1.1创建注册中心模块并导入Eureka服务依赖(基于spring-boot构建微服务项目),父模块导入spring-cloud相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
1.2在启动类上添加注解开启Eureka服务
package cn.itcast.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
1.3创建application.yml文件并配置相关配置信息
server:
port: 10086 # 服务端口
spring:
application:
name: eurekaserver # eureka的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
eureka本身也是一个服务,也需要配置注册信息
2 Eureka客户端搭建
客户端搭建也就是对于服务提供者和服务消费者的搭建。
2.1 创建客户端模块并引入依赖(所有项目基于spring-boot开发)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.2 创建application.yml文件并配置相关属性
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
spring:
application:
name: orderservice #当前项目名称
需要将eureka注册中心的信息配置
3 消费者该如何获取服务提供者具体信息?
服务提供者启动时向eureka注册自己的信息 eureka保存这些信息 消费者根据服务名称向eureka拉取提供者信息 如果有多个服务提供者,
消费者该如何选择?
服务消费者利用负载均衡算法,从服务列表中挑选一个
消费者如何感知服务提供者健康状态?
服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态 eureka会更新记录服务列表信息,心跳不正常会被剔除 消费者就可以拉取到最新的信息
4 总结
在Eureka架构中,微服务角色有两类: EurekaServer:服务端,注册中心 记录服务信息 心跳监控 EurekaClient:客户端 Provider:服务提供者,例如案例中的 user-service 注册自己的信息到EurekaServer 每隔30秒向EurekaServer发送心跳 consumer:服务消费者,例如案例中的 order-service 根据服务名称从EurekaServer拉取服务列表 基于服务列表做负载均衡,选中一个微服务后发起远程调用
二 Ribbon负载均衡
Ribbon是Netflix发布的一个开源项目,主要功能是提供客户端的软件负载均衡算法。Ribbon客户端组件提供了一系列完善的配置项,如连接超时、重试等。Ribbon内置了多种负载均衡策略,如轮询、随机等。Ribbon的工作流程如下:
- 服务消费者(例如order-service)发起请求,比如http://userservice/user/1。
- Ribbon获取并根据其服务ID(例如userservice)去注册中心(如Eureka或Nacos)拉取服务列表。服务列表包含了该服务ID对应的所有服务实例,例如[localhost:8080, localhost:8081]。
- Ribbon获取到服务列表后,会进行负载均衡策略的选择。这个过程由一个负载均衡拦截器完成,获取服务名后向下传递。服务名经过注册中心查询后,将服务列表返回给DynamicServerListLoadBalancer。DynamicServerListLoadBalancer再根据IRule的具体实现(如随机、轮询等),执行不同的负载均衡策略,选择服务列表中的一个服务实例。
- 选择服务列表的某个服务后,Ribbon会进行URL修改,将请求的目标地址改为所选择的服务实例的地址,然后请求真正的服务地址。以上步骤完成后,Ribbon就完成了对请求的负载均衡处理,将请求转发到了合适的服务实例上。需要注意的是,Ribbon默认采用的是懒加载策略,即第一次访问时才会去创建LoadBalanceClient,这可能会导致第一次访问的耗时较长。为了解决这个问题,可以开启饥饿加载,即在项目启动时就创建LoadBalanceClient,从而降低第一次访问的耗时。
- 开启懒加载的方式:
@Beanpublic IRule randomRule(){ return new RandomRule();}
配置文件:ribbon: eager-load: enabled: true # 开启饥饿加载 clients: # 指定饥饿加载的服务名称 - userservice
- Ribbon负载均衡规则 规则接口是IRule 默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询 负载均衡自定义方式 代码方式:配置灵活,但修改时需要重新打包发布 配置方式:直观,方便,无需重新打包发布,但是无法做全局配置 饥饿加载 开启饥饿加载 指定饥饿加载的微服务名称
三 Nacos注册中心
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口。
1.Nacos启动方式:
进入bin目录用cmd指令 startup.cmd -m standalone 开启 在集群情况下,用startup.cmd 指令。
在浏览器输入地址:http://127.0.0.1:8848/nacos即可访问
2.注册服务到Nacos
在项目父工程中添加spring-cloud-alilbaba的管理依赖:
<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>
在Nacos客户端也就是项目的子模块中添加客户端依赖
<!-- nacos客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改appliation.yml文件,将Eureka注册信息注释掉,并配置Nacos地址
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
项目启动成功后,就会在Nacos网站上看到注册信息
2.Nacos服务分级模型
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高 本地集群不可访问时,再去访问其它集群 Nacos的服务分级存储模型可分为三级:一级是服务,例如userservice 二级是集群,例如杭州或上海 三级是实例,例如杭州机房的某台部署了userservice的服务器
那么怎么配置服务集群呢?
我们只需要在Nacos的配置文件里添加一个配置信息discovery.cluster-name即可
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
cluster-name: HZ #配置集群名称,也就是机房位置
除此之外,还得配置Nacos的负载均衡策略
B服务:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
注意:这个负载均衡策略的配置,是对于同一个集群中,如果A服务访问B服务,那么想让A优先访问B服务,就在A服务中配置B服务的负载均衡策略
四 Feign
Fegin是一个声明式的http客户端 用于发送http请求
feign使用
- 客户端引入依赖 第二个依赖主要是用于后面的Feign的性能优化的配置
<!--feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--引入HttpClient依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2.在客户端启动类上添加注解**@EnableFeignClients**开启Fegin功能
@SpringBootApplication
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
需要指定Mapper接口的类型 如果需要配置Fegin的默认配置信息,可以添加defaultConfiguration 属性 并将配置类的类型添加
3.编写Feign客户端
@FeignClient(value = "userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
Feign是基于SpringMVC的注解来调用的 如上面程序:
服务名称:userservice 请求spring.application.name为userservice的服务下的接口
请求方式: GET
请求路径: /user/{id}
请求参数: Long id
返回值类型:User
Feign的性能优化
feign:
httpclient:
enabled: true # 支持HttpClient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数
一个是日志级别尽量用basic
配置文件开启httpClient功能,设置连接池参数
在开发中,对于Feign的接口以及相关POJO Feign 的配置都放到一个模块中,并在其他模块中引入该Feign的依赖用于调用API
五 网关Gateway
网关主要是用于身份认证和权限校验 服务路由和负载均衡 请求限流等 总而言之,对于一些请求,网关可以管理其权限,对整个微服务起保护作用
1.搭建网关
1.新建网关模块。引入网关依赖与Nacos发现依赖
<!--nacos服务注册发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2.身份认证以及Nacos注册配置
server: port: 10010 spring: application: name: gateway cloud: nacos: server-addr: localhost:8848 # nacos地址 gateway: routes: - id: user-service # 路由标示,必须唯一 uri: lb://userservice # 路由的目标地址 predicates: # 路由断言,判断请求是否符合规则 - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合 - id: order-service uri: lb://orderservice predicates: - Path=/order/** - id: user-service
routes:是一个网关路由配置数组 每个服务的网关配置用 - 表示
id: 唯一标识
uri: 服务地址 lb:表示负载均衡策略 后面跟服务器名称
predicates :断言 表示路径必须符合下面要求才能通过
具体断言的写法有以下11种:
下面图为一个具体请求过程
3.关于网关过滤器执行顺序:
4.关于网关中解决跨域请求的配置:
版权归原作者 向北漫漫无期 所有, 如有侵权,请联系我们删除。