一、Eureka结构与作用
1、Eureka注册中心功能:
服务注册与服务发现
2、提供者与消费者
在服务调用关系中,会有两个不同的角色:
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
服务既可以是服务提供者,也可以是服务消费者。
3、注册中心实例
- user-service服务实例启动后,将自己的信息注册到eureka-server
- eureka-server保存服务名称到服务实例地址列表的映射关系
- order-service根据服务名称,拉取实例地址列表。
- order-service从实例列表中利用负载均衡算法选中一个实例地址,向该实例地址发起远程调用
- user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
- 当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除,order-service拉取服务时,就能将故障实例排除了
二、Eureka使用
1、搭建eureka-server
eureka-server: eureka注册中心的服务端,自身也是个独立的微服务
- 创建项目
在cloud-demo父目录下创建eureka-server子目录
- 引入依赖
在eureka-server的pom文件中
<dependencies>
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
- 在启动类添加eureka自动装配开关注解
@EnableEurekaServer //eureka自动装配开关
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
- 在yml中填写配置信息
#服务端口号
server:
port: 10086
#服务器名称
spring:
application:
name: eurekaserver
#服务地址
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
启动测试:
访问:http://localhost:10086/
2、服务注册
将各个服务模块注册到eureka注册中心
- 引入依赖
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 配置文件
#服务器名称
spring:
application:
name: orderservice
#服务地址
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka #eureka-server端口号/eureka
启动多实例(启动两个user-service实例)
右键原服务实例
填写名称及实例端口号
- eureka注册中心效果
3、服务发现
在order-service服务中从eureka-server注册中心取出注册好的user-service服务,并且实现负载均衡
- 在order-service的启动类中,restTemplate上添加@LoadBalanced负载均衡注解
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 将RestTemplate注入Spring容器
* @return
*/
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 在order-service的service中,获取url时可以使用服务名代替 端口号+ip
// 2.获取url
String url="http://userservice/user/"+order.getUserId();