前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何把自己的服务打造的更加人性化?

如何把自己的服务打造的更加人性化?

作者头像
技术从心
发布2020-02-25 18:43:43
4730
发布2020-02-25 18:43:43
举报
文章被收录于专栏:技术从心技术从心

昨天有朋友在微信里联系我,问我啥时候继续更新 Spring Cloud 的文章,我很欣慰,那就来吧~继续撸起!

在上一节(外行人都能看得懂的Spring Cloud服务注册与发现,错过了血亏!)中,我们介绍了如何搭建 Eureka 服务注册中心,以及将订单服务成功注册到该服务中心,Eureka 的服务端口号是 7001,订单服务的端口号是 8001。

这篇文章,继续用通俗易懂的语言,告诉大家如何使我们的服务更加人性化。先来看下 eureka 的可视化界面如下。

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

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

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

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

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

上面我们给服务指定了一个更顺眼的名字,但是当我们把鼠标移到上面时,观看左下角的 url 信息,如下:

可以看到,显示的是:http://ifly-1741:8001/actuator/info,这不知道是啥啊。

这就好比说,我告诉你,你要想来了解我们公司的信息,你可以来 xxx 大楼8001层来了解。但是我根本就不知道 xxx 大楼的地址啊……

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

eureka 有个配置eureka.instance.prefer-ip-address,该配置默认为 false,我们需要把它设置为 true,这样就能正常显示 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 可以很清楚的看到服务的详细信息了。

OK,这篇文章主要给大家介绍了一些完善 Eureka 中服务信息的几点方法,这么完善之后,服务就更加人性化了,对排查问题也有很大的帮助作用。

每天

进步一点点

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档