使用 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.</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的服务信息的更多相关文章
- java 利用HttpURLConnection方式获取restful格式的服务数据
/** * @Author: * @Description:利用HttpURLConnection方式获取restful格式的服务数据 * @Date: */ private static List& ...
- Spring Cloud Eureka 2 (Eureka Server搭建服务注册中心)
工具:IntelliJ IDEA 2017.1.2 x64.maven3.3.9 打开IDE file===>new===>project next next 选择相应的依赖 next ...
- Spring Cloud(2)A Eureka server端 服务注册建立
1. 父项目pom <dependency> <groupId>org.springframework.cloud</groupId> <artifactId ...
- 用FireDAC获取 SQL SERVER错误文本信息
SQL SERVER获取错误文本信息,BDE.adoquery一直取不到,FDQuery可以了 Some DBMS, like SQL Server, return messages as an ad ...
- 获取SQL Server的版本信息
微软 SQL Server 版本号 产品名称 发行日期 主版本号 正式版 SP1 SP2 SP3 SP4 SQL Server 2016 2016.06.01 13.00.1601.5 13.00.1 ...
- ADO.NET 获取SQL SERVER数据库架构信息
1.确定可用字段数目 sqlDataReader类提供了FieldCount属性,可确定查询反悔了多少个字段. 2.确定返回行的数目 sqlDataReader中没有指示可用行的属性. 3.确定字段的 ...
- 【SpringCloud Eureka源码】从Eureka Client发起注册请求到Eureka Server处理的整个服务注册过程(下)
目录 一.Spring Cloud Eureka Server自动配置及初始化 @EnableEurekaServer EurekaServerAutoConfiguration - 注册服务自动配置 ...
- Eureka Server设计(转载 石杉的架构笔记)
目录: 一.问题起源 二.Eureka Server设计精妙的注册表存储结构 三.Eureka Server端优秀的多级缓存机制 四.总结 一.问题起源 Spring Cloud架构体系中,Eurek ...
- 【转载】一起来学Spring Cloud | Eureka Client注册到Eureka Server的秘密
LZ看到这篇文章感觉写得比较详细,理解以后,便转载到自己博客中,留作以后回顾学习用,喝水不忘挖井人,内容来自于李刚的博客:http://www.spring4all.com/article/180 一 ...
随机推荐
- SSM实战——秒杀系统之Web层Restful url设计、SpringMVC整合、页面设计
一:Spring整合SpringMVC 1:编写web.xml,配置DispatcherServlet <web-app xmlns="http://java.sun.com/xml/ ...
- js自动补全空白列(即缺少td的列)
//自动补全空白列 var rows = document.getElementById("gridTable").rows; //行对象 var allcells = rows[ ...
- docker overlay存储驱动介绍(传送门)
https://blog.csdn.net/u010278923/article/details/79215828
- SSM框架-使用MyBatis Generator自动创建代码
参考:http://blog.csdn.net/zhshulin/article/details/23912615 SSM搭建的时候用到MyBatis的代码自动生成的功能,由于MyBatis属于一种半 ...
- boost asio异步读写网络聊天程序client 实例具体解释
boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- windows上的Qt 5的依赖部署打包
通常我们编译Qt程序的时候最终会生成exe或dll,这些可执行文件都会有Qt模块的依赖,如果项目一旦庞大,就不是很好看出缺了什么模块,导致安装包安装到其他绿色干净的windows机器上会提示缺少XXX ...
- 【php正则】php正则匹配UTF-8格式的中文汉字 和 【,】【,】【。】等符号
1.php正则匹配UTF-8格式的中文汉字 和 [,][,][.]等符号 if (preg_match_all("/([\x{4e00}-\x{9fa5}]+((,)?)+((,)?)+(( ...
- open()系统调用的实现
open系统调用的服务例程是sys_open()函数,它接受三个参数:要打开文件的路径名filename, 访问模式的表示flags和文件权限掩码mode.在内核中,sys_open实际调用do_sy ...
- null的数据类型
Oracle的NULL代表的含义是不确定,那么不确定的东西也会有确定的数据类型吗?或者换个说法,NULL在Oracle中的默认数据类型是什么,下面就来探讨这个问题. 首先公布答案,NULL的默认类型是 ...
- 使用extract-text-webpack-plugin提取css文件
一.css之上的语言 js之上的语言有jsx.tyepscript.coffescript. html之上的语言有jade. css之上的语言有sass.scss.less.stylus,这几种语言区 ...