天天看點

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

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

昨天有朋友在微信裡聯系我,問我啥時候繼續更新 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 中服務資訊的幾點方法,這麼完善之後,服務就更加人性化了,對排查問題也有很大的幫助作用。

每天

進步一點點