對於一些系統不能接入 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(); } }
