目录
1.服务调用出现的问题
- 服务消费者该如何获取服务提供者的地址信息?
- 如果有多个服务提供者,消费者该如何选择?
- 消费者如何得知服务提供者的健康状态?
2.Eureka注册中心原理
order-service 如何得知 user-service 实例地址?
- user-service 服务实例启动后,将自己的信息注册到 eureka-server(Eureka服务端),叫做服务注册
- eureka-server 保存服务名称到服务实例地址列表的映射关系
- order-service 根据服务名称,拉取实例地址列表,这个叫服务发现或服务拉取
order-service 如何从多个 user-service 实例中选择具体的实例?
order-service从实例列表中利用负载均衡算法选中一个实例地址,向该实例地址发起远程调用
order-service 如何得知某个 user-service 实例是否依然健康,是不是已经宕机?
- user-service 会每隔一段时间(默认30秒)向 eureka-server 发起请求,报告自己状态,称为心跳
- 当超过一定时间没有发送心跳时,eureka-server 会认为微服务实例故障,将该实例从服务列表中剔除
- order-service 拉取服务时,就能将故障实例排除了
3.Eureka的作用
总结:
4.Eureka注册中心实现
4.1搭建注册中心
1.接第二章远程调用案例cloud_demo,创建maven子模块eureka-server,引入starter
<dependencies> <!--eureka服务端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
2.编写启动类,添加@EnableEurekaServer注解,开启 eureka 的注册中心功能
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
3.添加application.yml文件,编写下面的配置
server: port: 10086 # 服务端口 spring: application: name: eureka-server # 服务名称 eureka: client: service-url: # 地址信息 #eureka自己也是一个微服务,启动时需要将自己也注册到注册中心 defaultZone: http://127.0.0.1:10086/eureka
其中 defaultZone
是因为eureka 本身也是一个微服务,这里也要将自己注册进来,当后面 eureka 集群时,这里就可以填写多个,使用 “,” 隔开。
4.从启动类启动,访问http://localhost:10086/
启动报错:NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
解决:这是因为springboot和springcloud的版本不匹配,按照官网Spring Cloud说明使用匹配版本如:springboot2.7.x和springcloud2021.0.x
4.2服务注册
将 user-service、order-service 都注册到 eureka
1.在各模块引入依赖
<!--eureka客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2.修改配置文件
在配置文件添加以下内容
spring: application: #name: eureka-server # 服务名称 #name: order-server # 服务名称 name: user-server # 服务名称 eureka: client: service-url: # 地址信息 #注册到注册中心 defaultZone: http://127.0.0.1:10086/eureka
3.启动类启动
在注册中心可看到多个服务。
小技巧:通过 idea 的多实例启动,可以查看 Eureka 的集群效果。 为了避免端口冲突,需要修改端口设置
点击ok后在services可看到刚添加的实例
启动后,在eureka注册中心可看到
4.3服务拉取(发现)
在 order-service 中完成服务拉取,然后通过负载均衡挑选一个服务,实现远程调用
1.修改OrderService的代码,修改访问的url路径,用需要访问的服务的相应配置文件的服务名称代替ip、端口:
原:
String url = "http://localhost:8081/user/"+order.getUserId();
修改为:
String url = "http://user-server/user/"+order.getUserId();
2.在配置类给 RestTemplate
这个 Bean 添加一个 @LoadBalanced
注解,用于开启负载均衡
@Configuration
public class OrderConfiguration {
/**
* 创建RestTemplate并注入spring容器
* @return
*/
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3.重新启动order-server,
依次访问http://localhost:8080/order/101,http://localhost:8080/order/102
可以看到,eureka自动实现负载均衡