引入注册中心之前先引入提供者与消费者概念
提供者与消费者
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
提供者与消费者是相对的,一个服务既可以是提供者也可以是消费者
Eureka
若提供者有多个,消费者如何获取提供者信息,如何得知提供者的健康状态
在启动时,微服务向 Eureka 注册服务信息,消费者可通过 Eureka 拉取提供者信息,然后远程调用。微服务会每 30s 向 Eureka 说明自己还活着,Eureka 会更新记录服务列表信息,剔除不健康服务器
如果有多个服务提供者,消费者利用负载均衡算法,从服务列表中挑选一个
搭建
新建一个 Maven Module,引入依赖
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
编写启动类
1
2
3
4
5
6
7
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
配置文件
1
2
3
4
5
6
7
8
9
server:
port: 7995
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7995/eureka
注册服务
引入依赖
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
编写配置
1
2
3
4
5
6
7
spring:
application:
name: userService
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7995/eureka
服务使用
上例注册
1
2
3
4
5
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
修改调用的域名为服务名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.查询用户
// String url = "http://localhost:8081/user/" + order.getUserId();
String url = "http://userService/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
// 3.封装用户信息
order.setUser(user);
// 4.返回
return order;
}
}