对于一些系统不能接入 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. Dicom格式文件解析器[转]

    Dicom格式文件解析器   Dicom全称是医学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题 只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的 无非就是字节码数据流处理.只不 ...

  2. Android 调用webservice并解析

    这是调用webService的具体方法 private final static String nameSpace="http://tempuri.org/"; private f ...

  3. Java Runtime.exec

    http://www.cnblogs.com/softidea/p/4287519.html http://www.jianshu.com/p/af4b3264bc5d http://yindingt ...

  4. 单页面SPA应用路由原理 history hash

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  5. CString与UTF8互转代码

    这个代码网上很多,留在这里做个备份. static std::string ConvertCStringToUTF8( CString strValue ) { std::wstring wbuffe ...

  6. 转 通过phpize为php在不重新编译php情况下安装模块openssl

    假定:php编译安装路径:/usr/local/php/apache编译安装路径:/usr/local/apache/php配置文件路径:/etc/php.iniphp安装源路径:/usr/sourc ...

  7. 网站流量分析指标-PV/UV/PR/ip分析及区别

    1.什么是pv? PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标. 高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你 ...

  8. mybatis 于 hibernate区别

    两者区别是还是非常大的,结合至今为止的经验,总结出以下几点: 1. hibernate是全自动,而mybatis是半自动. hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的Ja ...

  9. 使用u盘安装os x系统

    从 App Store 下载 OS X 安装器 请执行以下步骤下载要安装的 OS X 版本. 1. 从 Apple 菜单中,选取“App Store”. 2. 按住 Option 键并点按“已购项目” ...

  10. ios中uitableview上拉刷新和下拉刷新(1)

    在一个项目开发过程中为了更好的体验经常会用到下拉刷新更新数据,当然也伴随一些上拉加载更多数据的情况:当前比较火的EGOTableViewPullRefresh只实现了下拉功能,而没有上拉的功能.这里介 ...