服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
远程调用有几个问题不得不进行考虑,如下
Eureka注册中心就是为了解决这些问题才出现的,Eureka的作用可以在下图中体现出来。

针对上面的三个问题,Eureka用下面的方式进行解决:
服务消费者该如何获取服务提供者的地址信息?在Eureka中,服务提供者启动时向eureka注册自己的信息,eureka保存这些信息。消费者根据服务名称向eureka拉取提供者信息。
如果有多个服务提供者,消费者该如何选择?如果存在多个可用的服务提供者,服务消费者利用负载均衡算法,从服务列表中挑选一个,该算法我们将会在后面讲到。
消费者如何得知服务提供者的健康状态?服务提供者会每隔30秒向Eureka Server发送心跳请求,报告健康状态,eureka会更新记录服务列表信息,心跳不正常会被剔除消费者就可以拉取到最新的信息。
这里我们继续使用前面的案例来进行示范。
在最顶级的目录中创建一个新的Module,如下所示。

然后选择Spring模板,如下:

之后勾选Eureka Server,完成模板的创建。

<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
并且在启动类前面加上注释 @EnableEurekaServer,如下
@EnableEurekaServer
@SpringBootApplication
public class EurakeServeApplication {
public static void main(String[] args) {
SpringApplication.run(EurakeServeApplication.class, args);
}
}
在springboot的配置文件中对其进行配置,配置信息如下:
server:
port: 10086
spring:
application:
name: eurekaserver
eureka:
client:
service-url:
# Eureka的注册中心地址
defaultZone: http://127.0.0.1:10086/eureka/
运行上面的微服务,打开对应的地址 http://localhost:10086/ 可以得到下面的场景

在这些信息中,最重要的就是红框中的信息,代表着微服务的注册和中心和提供者。
接下来我们就可以尝试将微服务提供者注册到Eureka了。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
注意:,注入的依赖一定要有spring-cloud-starter-netflix-eureka-client,而不能光是spring-cloud-netflix-eureka-client,这个坑我替你们踩了。
在配置文件中进行配置,配置如下:
spring:
application:
name: userserver
eureka:
client:
service-url:
# Eureka的注册中心地址
defaultZone: http://127.0.0.1:10086/eureka
注意上面的 spring.application.name 的名字内容要变。
重启微服务进行测试,打开 http://localhost:10086/,看到如下画面

发现注册的Serve全在里面,表示注册成功。
点击微服务启动的右键,选择 Copy Configuration

如果完全复制的话会产生端口冲突,这里修改第二个实例的端口,如下图

点击OK或者Apply后,在Not Started 下面就会出现UserService的另一个实例,将其启动。

运行后在Eureka注册中心查看,可以看到有两个UserServer实例。

首先在Order的启动类中添加负载均衡 @LoadBalanced 的注解,如下
@Bean
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
然后将访问的地址进行改变,变为 "http://userserver/user/id",
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单并返回
Order order = orderService.queryOrderById(orderId);
String url = "http://userserver/user/" + order.getUserId();
User forObject = restTemplate.getForObject(url, User.class);
order.setUser(forObject);
return order;
}
这样,访问userserver的时候Eureka会自动选择一个示例来进行访问。
测试时,例如调用 http://localhost:8080/order/101 发现同样可以访问,这样就避免了让我们选取实例访问的问题了。