图源:
Eureka 常被用作 Spring Cloud 的注册中心,用于注册微服务的接口提供方。
在中,我们实现了两个子模块互相调用接口,但存在一个缺陷,接口的主机名是硬编码的。这样很难维护,且没法做集群。这个问题正好可以用 Eureka 解决。
本文将学习如何在项目中添加 Eureka 注册中心,以及将接口注册到 Eureka。
本文的示例项目基于构建的项目。
添加 Eureka 服务端
按照上一篇文章介绍过的方式,添加一个 Maven 子模块 eureka-server:
依赖
在子模块 eureka-server 中添加 eureka 服务端的依赖:
<dependencies>
<!--eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
启动类
添加一个根包 org.example.shopping.eureka,并添加启动类:
package org.example.shopping.eureka;
// ...
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
不要忘记添加
@EnableEurekaServer
,否则 Eureka 不能正常启动,会报错。
配置文件
添加配置文件 application.yml :
server
port8090
spring
application
name eureka-server
eureka
client
service-url
defaultZone http //localhost 8090/eureka
这里的配置项 eureka.client.service-url.defaultZone 用于将当前应用注册到指定的 eureka,在eureka-server 这个子模块中,意味着将自己注册到自己。这样设计是有意义的,eureka 本身也可以做集群,如果那样,可以通过这种方式将 eureka 注册到所在的集群服务器。
控制面板
现在访问 http://localhost:8090/ 就能看到 Eureka 的控制面板:
其中的 Instances currently registered with Eureka 显示的是当前注册到 Eureka 上的微服务实例。之所以说是“实例”,是因为同一个微服务应用可以部署多个实例,作为集群使用,此时接口调用时就可以用负载均衡的方式选取其中一个调用。
注册服务
下面将子模块 shopping-user 注册到 Eureka,这样子模块 shopping-order 就可以通过 Eureka 获取接口地址并调用接口,不用再将接口硬编码了。
依赖
在在模块 shopping-user 的 POM 中添加 Eureka 客户端的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
如果 Maven 不能正常下载依赖,可以选取一个指定版本的依赖,我这里使用了
3.1.3
(服务端也使用了这个版本):
配置文件
修改配置文件,添加应用名和 Eureka 服务端地址:
spring
application
name shopping-user
eureka
client
service-url
defaultZone http //localhost 8090/eureka
测试
现在启动子模块 shopping-user 和 eureka-server,打开 eureka 的控制面板:
可以看到两个注册的服务,Status 列也可以看到服务地址。
启动多个实例
在 Service 面板中右键 Copy Configuration:
如果没有 Service 窗口,可以通过菜单 view->tool windows->services 开启。
为另一个运行实例起一个名字,并添加启动参数 -Dserver.port=8082:
现在 Not Started 菜单下会出现刚添加的启动配置。
右键 run 启动。
现在在 Eureka 的控制面板就能看到启动了两个 shopping-user 实例。
使用服务
依赖
子模块 shopping-order 要使用 Eureka 获取服务地址,同样需要添加 Eureka 客户端依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.1.3</version>
</dependency>
配置文件
修改配置文件,添加 Eureka 服务地址:
spring
application
name shopping-order
eureka
client
service-url
defaultZone http //localhost 8090/eureka
负载均衡
启用负载均衡,这里只需要为RestTemplate
的 bean 方法添加@LoadBalanced
注解:
public class WebConfig {
RestTemplate restTemplate(){
return new RestTemplate();
}
}
服务调用
修改OrderService
,将硬编码的接口地址修改为使用 Eureka 上注册的服务名:
public class OrderService {
// ...
public Order findOrderById(Long orderId) {
Order order = orderMapper.findById(orderId);
String url = String.format("http://shopping-user/user/%d", order.getUserId());
Result<?> result = restTemplate.getForObject(url, Result.class);
// ...
}
}
现在再尝试访问接口 http://localhost:8080/order/101,可以通过 IDEA 的 services 窗口查看到 shopping-user 的其中一个实例响应了接口调用。
The End,谢谢阅读。
本文的完整示例代码可以从获取。
参考资料
文章评论