【夯实Spring Cloud】Spring Cloud中如何完善Eureka中的服务信息

版权声明:尊重博主原创文章,转载请注明出处 https://blog.csdn.net/eson_15/article/details/85226439

本文属于【夯实Spring Cloud】系列文章,该系列旨在用通俗易懂的语言,带大家了解和学习Spring Cloud技术,希望能给读者带来一些干货。系列目录如下:

【夯实Spring Cloud】Dubbo沉睡5年,Spring Cloud开始崛起!
【夯实Spring Cloud】Spring Cloud中基于maven的分布式项目框架的搭建
【夯实Spring Cloud】Spring Cloud中的Eureka服务注册与发现详解
【夯实Spring Cloud】Spring Cloud中如何完善Eureka中的服务信息
【夯实Spring Cloud】Spring Cloud中使用Eureka集群搭建高可用服务注册中心(正在写……)
【夯实Spring Cloud】Spring Cloud中使用Ribbon实现负载均衡详解(正在写……)
【夯实Spring Cloud】Spring Cloud中使用Feign实现负载均衡详解(正在写……)
【夯实Srping Cloud】Spring Cloud中使用Hystrix实现断路器原理详解(正在写……)
【夯实Spring Cloud】Spring Cloud中使用Zuul实现路由网关详解(正在写……)
【夯实Spring Cloud】Spring Cloud分布式配置中心详解(正在写……)
【夯实Spring Cloud】未完待续


在上一节中,我们介绍了如何搭建 Eureka 服务注册中心,以及将订单服务成功注册到该服务中心,Eureka 的服务端口号是 7001,订单服务的端口号是 8001,我们访问 eureka 的可视化界面如下:
eureka可视化界面

1. 给服务起个更顺眼的名字

我先打个比方,还是上一节举的例子,很多创业公司入住经济开发区的写字楼,那每个公司总得有名字吧,或者对外总得有一个合适的称呼吧,你不能用一大长串公司代码来指定该公司,这样不仅不容易记住,更重要的是不好识别。

由上一节内容,我们知道,左侧的服务名称 MICROSERVICE-ORDER 是在项目中通过配置文件指定的。右边的信息是注册到 eureka 的服务信息,即ifly-1741:microservice-order:8001,但是通过这个信息,我们无法获知具体的细节。我们要改的就是这个地方。

当有很多微服务注册到 Eureka 时,如果有哪个服务坏掉了,我们希望是能够很直观的知道是哪个服务出了问题,这样能更加快捷的定位问题。比如我们知道这是个订单服务,端口号是 8001,那么如果我们直接显示 “订单服务-8001”,是不是更加直观呢?答案是肯定的,我们在订单服务的配置文件中,通过 eureka.instance.instance-id 即可指定。
指定服务

2. 给服务指定一个正确的ip

上面我们给服务指定了一个更顺眼的名字,但是当我们把鼠标移到上面时,观看左下角的 url 信息,如下:
url信息
可以看到,显示的是:http://ifly-1741:8001/actuator/info,这不知道是啥啊,这就好比说,我告诉你,你要想来了解我们公司的信息,你可以来 xxx 大楼8001层来了解。但是我根本就不知道 xxx 大楼的地址啊……

我们当然不希望出现这种情况,可读性太低了,这里理论上应该是显示该服务自身的 ip 才对,那么如何让这里的 ip 显示正常呢?

eureka 有个配置 eureka.instance.prefer-ip-address,该配置默认为 false,我们需要把它设置为 true,这样就能正常显示 ip 地址了。

设置ip显示

3. 给服务一个展示详细信息页面

做好了上面这一步之后,我们点击“订单服务-8001”这个链接,会访问:http://192.168.75.1:8001/actuator/info 这个地址,这没问题。但是发现会报404错误,说明并不能找到该服务的详细信息。

这就好比说,我这公司的名字也起了,地址也给你了,你接下来就跟着高德地图的导航来找我了,但是我的信息还没有导入到高德地图啊……也就是说,高德地图还不能监视到我的信息,你当然找不到我了。那怎么办呢?

我们看这个 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"
    }
}

哎?这样就比较友好了,我公司名字也有了,地址也给你了,在地图上的信息也录入了,接下来你就可以顺利到我公司来参观,来了解我司信息了。

4. 给别人一个了解你的机会

通过上面一些配置,这个服务的相关信息可以说比较友好了。但是还有个问题啊,我公司别名起好了,地址也有了,也录入地图里了,但是我怎么能让外界知道这些信息呢?我得有个公司主页吧,也就是说,得有个入口让别人知道这些信息才行。

这就叫服务发现。我们都说 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 可以很清楚的看到服务的详细信息了。
详细信息json
OK,这一节主要给大家介绍了一些完善 Eureka 中服务信息的几点方法,这么完善之后,服务就更加人性化了,对排查问题也有很大的帮助作用。


更多优质文章请关注我的微信公众号【程序员私房菜】,更多编程和架构等学习资源等你来获取。

程序员私房菜

猜你喜欢

转载自blog.csdn.net/eson_15/article/details/85226439