使用 http 請求方式獲取 eureka server的服務信息


 對於一些系統不能接入 eureka server,又需要訪問接入eureka server 的服務。

方法一:直接調用服務的地址是一種實現方式,弊端就是地址是寫死的,萬一服務地址變更則訪問不到。

方法二:通過訪問 eureka server,發現已經注冊的服務地址。然后訪問提供服務的主機。

 

在此主要說明一下如何獲取注冊在 eureka server 上的服務信息。

可以通過 http 請求操作 eureka server,具體信息可以參考官網地址:

https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

 

1) 獲取所有服務的信息。

GET 請求: localhost:8076/eureka/apps

指定返回 xml 格式的數據,在請求頭中添加下面2個:

Content-Type:application/json
Accept:application/xml

 

如果想返回json數據的格式,在請求頭中添加下面2個即可:

Content-Type:application/json
Accept:application/json

 

2) 獲取指定服務的信息。

GET 請求: localhost:8076/eureka/apps/STUDENT-SERVICE

STUDENT-SERVICE 是你的應用名稱也就是spring.application.name

 

2 通過 okHttp 獲取請求

2.1 引入 maven 依賴

        <dependency>
          <groupId>com.squareup.okhttp3</groupId>
          <artifactId>okhttp</artifactId>
          <version>3.11.0</version>
        </dependency>

 

2.2 通過 GET 請求

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("http://127.0.0.1:8010/eureka/apps/SERVICE-PROVIDER")
                .addHeader("Content-Type", "application/json")
                .addHeader("Accept", "application/xml")
                .build();
        try {
            Response response = client.newCall(request).execute();
            if (response.isSuccessful()) {
                System.out.println(response.body().string());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

 

 2.3  獲取微服務的所有地址工具類

/**
     * 獲取服務的所有地址(注冊在 eureka server 上的服務)
     * @param eurekaIp
     * @param eurekaPort
     * @param servicename
     * @return
     */
    public static List<String> getAllServiceAddr(String eurekaIp, String eurekaPort, String servicename) {
        List<String> result = new ArrayList<>();
        String url = "http://" + eurekaIp + ":" + eurekaPort + "/eureka/apps/" + servicename;
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)//請求接口。如果需要傳參拼接到接口后面。
                .addHeader("Content-Type","application/json")
                .addHeader("Accept","application/xml")
                .get()
                .build();//創建Request 對象
        Response response = null;
        try {
            response = okHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                String responseContent = response.body().string();
                Matcher matcher = Pattern.compile("<homePageUrl>(.+?)</homePageUrl>").matcher(responseContent);
                while (matcher.find()) {
                    String homepage = matcher.group(1).trim();
                    result.add(homepage);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 隨機獲取一個微服務的地址
     * @param eurekaIp
     * @param eurekaPort
     * @param servicename
     * @return
     */
    public static String getOneServiceAddr(String eurekaIp, String eurekaPort, String servicename) {
        List<String> result = new ArrayList<>();
        String url = "http://" + eurekaIp + ":" + eurekaPort + "/eureka/apps/" + servicename;
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)//請求接口。如果需要傳參拼接到接口后面。
                .addHeader("Content-Type","application/json")
                .addHeader("Accept","application/xml")
                .get()
                .build();//創建Request 對象
        Response response = null;
        try {
            response = okHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                String responseContent = response.body().string();
                Matcher matcher = Pattern.compile("<homePageUrl>(.+?)</homePageUrl>").matcher(responseContent);
                while (matcher.find()) {
                    String homepage = matcher.group(1).trim();
            if (homepage.endsWith("/")) {
                        homepage = homepage.substring(0, homepage.length()-1);
                    } result.add(homepage); } } }
catch (IOException e) { e.printStackTrace(); } if (result.isEmpty()) { return ""; } else { Collections.shuffle(result); return result.get(0); } }

 

使用示例

List<String> allServiceAddr = getAllServiceAddr("127.0.0.1", "8010", "SERVICE-PROVIDER");
        for (String url : allServiceAddr) {
            System.out.println(url);
        }

獲取注冊在127.0.0.1的 eureka server上,服務名為 “SERVICE-PROVIDER” 的所有 地址信息。返回的是eureka server 上保存的所有服務地址,有可能不可用跟 eureka server的屬性有關。

 

2.4 OkHttp POST 請求,請求方式是 application/json

代碼示例如下:

public static void postRequest() {
        OkHttpClient client = new OkHttpClient();
        RequestParamBase param = RequestParamBase.builder().id(24).name("requestParam").build();
        ObjectMapper mapper = new ObjectMapper();
        String json = "";
        try {
            json = mapper.writeValueAsString(param);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
        Request request = new Request.Builder().post(body).url("http://127.0.0.1:8060/student/1").build();
        try {
            Response response = client.newCall(request).execute();
            if (response.isSuccessful()) {
                String responseString = response.body().string();
                com.sse.model.Response result = mapper.readValue(responseString, com.sse.model.Response.class);
                System.out.println(result);
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM