一、问题
1、order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
:::danger
获取地址信息的流程如下:
- user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端)。这个叫服务注册
- eureka-server保存服务名称到服务实例地址列表的映射关系
order-service根据服务名称,拉取实例地址列表。这个叫服务发现或服务拉取 ::: 2、有多个user-service实例地址,order-service调用时该如何选择? :::danger
order-service从实例列表中利用负载均衡算法选中一个实例地址
向该实例地址发起远程调用 ::: 3、order-service如何得知某个user-service实例是否依然健康,是不是已经宕机? :::danger
user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
- 当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除
- order-service拉取服务时,就能将故障实例排除了
:::
注意:一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端
二、Eureka注册中心搭建步骤
一、创建eureka-server服务
1、在cloud-demo父工程下,创建一个子模块:二、引入eureka依赖
:::danger :::
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server 三、编写启动类
@SpringBootApplication
@EnableEurekaServer //开启Eureka注册服务
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
四、编写配置文件
编写一个application.yml文件,内容如下: server: port: 10086 spring: application: name: eureka-server eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka register-with-eureka: false # 不注册自己 fetch-registry: false #不拉取服务本eureka服务中的服务信息
五、服务注册(客户端)
1、导入依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
2、配置文件
在user-service中,修改application.yml文件,添加服务名称、eureka地址
spring: application: name: userservice eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka instance: # 在Eureka中显示服务的ip地址 ip-address: 127.0.0.1 # 配置服务器ip地址 prefer-ip-address: true # 更倾向于使用ip,而不是host名 instance-id: ${eureka.instance.ip-address}:${server.port} # 自定义实例的id
3、启动多个服务实例
- 首先,复制原来的user-service启动配置:
1、引入依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
2、配置文件
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
instance: # 在Eureka中显示服务的ip地址
ip-address: 127.0.0.1 # 配置服务器ip地址
prefer-ip-address: true # 更倾向于使用ip,而不是host名
instance-id: ${eureka.instance.ip-address}:${server.port} # 自定义实例的id
3、服务拉取负载均衡
在order-service的OrderApplication中,给RestTemplate这个Bean添加一个 @LoadBalanced注解:
/**
* 注册RestTemplate
* @return
*/
@Bean
@LoadBalanced //负载均衡策略
public RestTemplate restTemplate(){
return new RestTemplate();
}
修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口:
总结:
Eureka和Ribbon总结.md