对于一些系统不能接入 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. angularjs中的坑

    ng-show 等ng的指令中不需要使用{{parameter}}来取值,回无效

  2. MySQL排序:SELECT ORDER BY

    SELECT 和ORDER BY结合进行排序: products表例如以下: a 按产品名称列进行排序: b 按多个列进行排序,默认排序顺序为升序: c 指定排序方向,即指定为降序: d 对多个列进行 ...

  3. http 三次握手

    1.三次握手 目的:主要规避由于网络阻塞,传输不畅等原因导致服务器端端口一直被占用,无法释放端口资源.(想想假设只要一次就建立连接,服务器响应后浏览器若是没收到数据,等待一段时间后,网络超时,浏览器重 ...

  4. length-of-last-word 最后一个单词的长度

    Given a string s consists of upper/lower-case alphabets and empty space characters' ', return the le ...

  5. 〖Android〗CyanogenMod同步错误的解决

    1. 错误信息: repo sync CyanogenMod/Superuser Fetching project CyanogenMod/Superuser Fetching projects: % ...

  6. Java千百问_05面向对象(005)_接口和抽象类有什么差别

    点击进入_很多其它_Java千百问 1.接口和抽象类有什么差别 在Java语言中.抽象类abstract class和接口interface是抽象定义的两种机制. 正是因为这两种机制的存在,才赋予了J ...

  7. VREP中的二维激光雷达

    目前,轮式机器人的研究中已经大量使用激光雷达辅助机器人的避障导航,考虑到使用成本,一般二维激光雷达使用较多,如下图.由于只能扫描一个平面,如果想用二维激光雷达获取环境三维点云,则需要通过移动机器人或加 ...

  8. Lotus Domino开发心得(一)

    —- Lotus Domino 是当今办公自动化系统的主流开发平台之一,目前大部分企业和机构都在使用Lotus Domino 开发自己的无纸办公系统.在开发过程中,我积累了一些小技巧,现在公布出来,希 ...

  9. java第六节 字符串/集合

    /* *String类和StringBuffer类 * 位于java.lang包中 * String类对象中的内容一旦被初始化就不能再改变 * StringBuffer类中用于封装内容可以改变的字符串 ...

  10. java动态代理技术

    主要用来做方法的增强.让你能够在不改动源代码的情况下,增强一些方法,在方法运行前后做不论什么你想做的事情(甚至根本不去运行这种方法).由于在InvocationHandler的invoke方法中,你能 ...