在上一节中,我们介绍了如何搭建 Eureka 服务注册中心,以及将订单服务成功注册到该服务中心,Eureka 的服务端口号是 7001,订单服务的端口号是 8001,我们访问 eureka 的可视化界面如下:
我先打个比方,还是上一节举的例子,很多创业公司入住经济开发区的写字楼,那每个公司总得有名字吧,或者对外总得有一个合适的称呼吧,你不能用一大长串公司代码来指定该公司,这样不仅不容易记住,更重要的是不好识别。
由上一节内容,我们知道,左侧的服务名称 MICROSERVICE-ORDER 是在项目中通过配置文件指定的。右边的信息是注册到 eureka 的服务信息,即ifly-1741:microservice-order:8001,但是通过这个信息,我们无法获知具体的细节。我们要改的就是这个地方。
当有很多微服务注册到 Eureka 时,如果有哪个服务坏掉了,我们希望是能够很直观的知道是哪个服务出了问题,这样能更加快捷的定位问题。比如我们知道这是个订单服务,端口号是 8001,那么如果我们直接显示 “订单服务-8001”,是不是更加直观呢?答案是肯定的,我们在订单服务的配置文件中,通过 eureka.instance.instance-id
即可指定。
上面我们给服务指定了一个更顺眼的名字,但是当我们把鼠标移到上面时,观看左下角的 url 信息,如下:
我们当然不希望出现这种情况,可读性太低了,这里理论上应该是显示该服务自身的 ip 才对,那么如何让这里的 ip 显示正常呢?
我们看这个 url 里面有个 actuator,没错,Actuator 在 Spring Boot 中是用来监控的,我们在使用时需要导入这个依赖。
<!-- spring boot actuator 监控信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
但是光导入依赖还不行啊,就好比你去高德地图注册了账号,但是你的详细信息还得录入到高德地图的系统里啊。那怎么办呢?
在导入了 actuator 依赖后,我们可以在配置文件中可以将这些服务的相关信息给初始化好,当用户点击上面的服务链接后,就可以以 json 的格式展示出来。比如:
# 用来展示项目的基本信息
info:
author.name: shengwu ni
app.name: microservice
server.port: ${server.port}
application.name: ${spring.application.name}
当点击“订单服务-8001”访问 http://192.168.75.1:8001/actuator/info
时就会出现以下 json,即我们项目中配置的信息。
{
"author": {
"name": "shengwu ni"
},
"app": {
"name": "microservice"
},
"server": {
"port": "8001"
},
"application": {
"name": "microservice-order"
}
}
这就叫服务发现。我们都说 Eureka 服务注册与发现,说到现在,我们一直在讨论 Eureka 的服务注册功能,让服务注册到 Eureka 中,我们可以在 Eureka 界面看到这些服务,但是如何被外界发现呢?我们需要暴露一个接口给外界,专门提供本服务的详细信息。
如何提供呢?我们需要写一个接口,暴露给外界调用,如下:
/**
* 订单服务
* @author shengwu ni
*/
@RestController
@RequestMapping("/provider/order")
public class OrderProviderController {
@Resource
private EurekaClient client;
private static final Logger LOGGER = LoggerFactory.getLogger(OrderProviderController.class);
@GetMapping("/discovery")
public Object discovery() {
// 获取Eureka中所有的服务节点
List<Application> applications = client.getApplications().getRegisteredApplications();
if (applications != null) {
for (Application application : applications) {
// 对外暴露的服务名称
String name = application.getName();
// 只看订单服务信息
if ("MICROSERVICE-ORDER".equals(name)) {
// 服务有多少个实例,比如订单服务可能部署了多个,有多个订单服务注册到了eureka
List<InstanceInfo> instances = application.getInstances();
LOGGER.info("所有的订单服务:{}", instances);
if (instances != null) {
for (InstanceInfo info : instances) {
LOGGER.info("服务id:{}", info.getInstanceId());
LOGGER.info("服务主机:{}", info.getHostName());
LOGGER.info("服务端口:{}", info.getPort());
}
}
return instances;
}
}
}
return null;
}
}
首先,需要引入 EurekaClient 端,在接口内部,通过 EurekaClient 获取到注册在 Eureka 上的所有 Application,这里的 application 其实就是我们常说的服务节点,从而获取到服务节点的信息,包括服务节点的名称、状态、IP、端口、心跳情况等信息。直接将服务的信息返回即可。
这样我们通过访问该接口,通过返回的 json 可以很清楚的看到服务的详细信息了。
更多优质文章请关注我的微信公众号【武哥聊编程】,回复“资源”、“架构”、“简历”等关键词,可以领取海量优质的视频学习资源。大家共同进步。
因篇幅问题不能全部显示,请点此查看更多更全内容