对于一些系统不能接入 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.</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().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().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();
}
}

使用示例

List<String> allServiceAddr = getAllServiceAddr("127.0.0.1", "", "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().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();
} }

使用 http 请求方式获取 eureka server的服务信息的更多相关文章

  1. java 利用HttpURLConnection方式获取restful格式的服务数据

    /** * @Author: * @Description:利用HttpURLConnection方式获取restful格式的服务数据 * @Date: */ private static List& ...

  2. Spring Cloud Eureka 2 (Eureka Server搭建服务注册中心)

    工具:IntelliJ IDEA 2017.1.2 x64.maven3.3.9 打开IDE  file===>new===>project next next 选择相应的依赖 next ...

  3. Spring Cloud(2)A Eureka server端 服务注册建立

    1. 父项目pom <dependency> <groupId>org.springframework.cloud</groupId> <artifactId ...

  4. 用FireDAC获取 SQL SERVER错误文本信息

    SQL SERVER获取错误文本信息,BDE.adoquery一直取不到,FDQuery可以了 Some DBMS, like SQL Server, return messages as an ad ...

  5. 获取SQL Server的版本信息

    微软 SQL Server 版本号 产品名称 发行日期 主版本号 正式版 SP1 SP2 SP3 SP4 SQL Server 2016 2016.06.01 13.00.1601.5 13.00.1 ...

  6. ADO.NET 获取SQL SERVER数据库架构信息

    1.确定可用字段数目 sqlDataReader类提供了FieldCount属性,可确定查询反悔了多少个字段. 2.确定返回行的数目 sqlDataReader中没有指示可用行的属性. 3.确定字段的 ...

  7. 【SpringCloud Eureka源码】从Eureka Client发起注册请求到Eureka Server处理的整个服务注册过程(下)

    目录 一.Spring Cloud Eureka Server自动配置及初始化 @EnableEurekaServer EurekaServerAutoConfiguration - 注册服务自动配置 ...

  8. Eureka Server设计(转载 石杉的架构笔记)

    目录: 一.问题起源 二.Eureka Server设计精妙的注册表存储结构 三.Eureka Server端优秀的多级缓存机制 四.总结 一.问题起源 Spring Cloud架构体系中,Eurek ...

  9. 【转载】一起来学Spring Cloud | Eureka Client注册到Eureka Server的秘密

    LZ看到这篇文章感觉写得比较详细,理解以后,便转载到自己博客中,留作以后回顾学习用,喝水不忘挖井人,内容来自于李刚的博客:http://www.spring4all.com/article/180 一 ...

随机推荐

  1. SSM实战——秒杀系统之Web层Restful url设计、SpringMVC整合、页面设计

    一:Spring整合SpringMVC 1:编写web.xml,配置DispatcherServlet <web-app xmlns="http://java.sun.com/xml/ ...

  2. js自动补全空白列(即缺少td的列)

    //自动补全空白列 var rows = document.getElementById("gridTable").rows; //行对象 var allcells = rows[ ...

  3. docker overlay存储驱动介绍(传送门)

    https://blog.csdn.net/u010278923/article/details/79215828

  4. SSM框架-使用MyBatis Generator自动创建代码

    参考:http://blog.csdn.net/zhshulin/article/details/23912615 SSM搭建的时候用到MyBatis的代码自动生成的功能,由于MyBatis属于一种半 ...

  5. boost asio异步读写网络聊天程序client 实例具体解释

    boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  6. windows上的Qt 5的依赖部署打包

    通常我们编译Qt程序的时候最终会生成exe或dll,这些可执行文件都会有Qt模块的依赖,如果项目一旦庞大,就不是很好看出缺了什么模块,导致安装包安装到其他绿色干净的windows机器上会提示缺少XXX ...

  7. 【php正则】php正则匹配UTF-8格式的中文汉字 和 【,】【,】【。】等符号

    1.php正则匹配UTF-8格式的中文汉字 和 [,][,][.]等符号 if (preg_match_all("/([\x{4e00}-\x{9fa5}]+((,)?)+((,)?)+(( ...

  8. open()系统调用的实现

    open系统调用的服务例程是sys_open()函数,它接受三个参数:要打开文件的路径名filename, 访问模式的表示flags和文件权限掩码mode.在内核中,sys_open实际调用do_sy ...

  9. null的数据类型

    Oracle的NULL代表的含义是不确定,那么不确定的东西也会有确定的数据类型吗?或者换个说法,NULL在Oracle中的默认数据类型是什么,下面就来探讨这个问题. 首先公布答案,NULL的默认类型是 ...

  10. 使用extract-text-webpack-plugin提取css文件

    一.css之上的语言 js之上的语言有jsx.tyepscript.coffescript. html之上的语言有jade. css之上的语言有sass.scss.less.stylus,这几种语言区 ...