1. Eureka框架介绍
服务治理是微服务中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。 Eureka 是 Netflix 开发的服务发现框架, SpringCloud 将它集成在其子项目 spring-cloud-netflix 中,以实现 SpringCloud的服务发现功能。
- Eureka服务端:即服务注册中心。它同其他服务注册中心一样,支持高可用配置。
- Eureka客户端:主要处理服务的注册和发现。在应用程序启动时,Eureka客户端向服务注册中心注册自身提供的服务,并周期性的发送心跳来更新它的服务租约。同时,他也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性的刷新服务状态。
2. 搭建Eureka服务
2.1 注册中心
创建EurekaServer项目,引入
spring-cloud-starter-netflix-eureka-server
依赖。 :::info
<_dependency>
<_groupId_>org.springframework.cloud
<_artifactId_>spring-cloud-starter-netflix-eureka-server
_ :::编写启动类,添加
@EnableEurekaServer
注解;添加 application.yml 文件,编写配置:
server:
port: 8000 # 服务端口
spring:
application:
name: eureka-server # eureka的服务名称
eureka:
server:
enable-self-preservation: false # 禁用自我保护模式,原因在下面有解释
client:
service-url: # eureka地址信息
defaultZone: http://127.0.0.1:10080/eureka
register-with-eureka: true # 是否注册自己的信息到 EurekaServer,默认是true
fetch-registry: false # 是否拉取其它服务的信息,默认是true
instance:
prefer-ip-address: true
启动项目
2.2 服务注册
在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,注册中心按照服务名分类组织服务清单,同时还需要以心跳检测的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,以达到排除故障服务的效果。
user-service 项目中引入
spring-cloud-starter-netflix-eureka-client
依赖; :::info <_dependency>
<_groupId_>org.springframework.cloud
<_artifactId_>spring-cloud-starter-netflix-eureka-client
_ :::配置 application.yml 文件:
server: port: 8081 #eureka配置 eureka: client: service-url: # eureka地址信息 defaultZone: http://127.0.0.1:8000/eureka
另外我们可以将 user-service 在 IDEA 中多次启动,模拟多个实例,为了避免端口冲突,需要修改端口设置:
- 在启动两个 user-service 和一个 order-service 并注册到 Eureka 后,查看 Eureke 客户端:
2.3 服务发现
在服务治理框架下,服务间的调用不再通过指定具体的实例地址来实现,而是通过服务名发起请求调用实现。服务调用方通过服务名从服务注册中心的服务清单中获取服务实例的列表清单,通过指定的负载均衡策略取出一个服务实例位置来进行服务调用。
修改 order-service(服务消费者)项目中的访问 url 路径,用服务名代替 ip 和端口; :::info String url = “http://user-service/user/“ + order.getUserId(); :::
在 order-service(服务消费者)的启动类中 RestTemplate 上添加负载均衡注解
@LoadBalanced
; ```java @MapperScan(“cn.itcast.order.mapper”) @SpringBootApplication public class OrderApplication {public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
// 负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
} ```