服务调用出现的问题
- url硬编码问题,不用硬编码如何获取服务提供者地址信息
- 如果有多个服务提供者(集群),消费者如何选择
- 消费者如何得知服务提供者的健康状态
Eureka的作用
- eureka-server:注册中心,管理微服务
- eureka-client:客户端,分为提供者和消费者
- 每一个客户端启动时,会把自己信息注册,每30s一次心跳续约,确认状态
- 消费者需要时,注册中心拉取服务,负载均衡选取一个微服务,提供给远程调用
创建eureka-server服务
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 8 9 10 11 12 13
| package cn.itcast.eureka;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication @EnableEurekaServer 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: 10086 spring: application: name: eureka-server eureka: client: service-url: defaultZone: http://127.0.0.1:10086/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:10086/eureka
|
服务拉取
服务拉取是基于服务名称获取服务列表,然后再对服务列表做负载均衡
- 修改OrderService的代码,修改访问的url路径,用服务名代替ip,端口
1
| String url = "http://userservice/user/" + order.getUserId();
|
- 在order-service项目的启动类中的RestTemplate添加负载均衡注解
1 2 3 4 5
| @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }
|