使用 http 请求方式获取 eureka server的服务信息

本文深入探讨了Eureka服务发现机制,详细介绍了如何通过HTTP请求获取注册在Eureka Server上的服务信息,包括获取所有服务信息及特定服务的详细信息。同时,提供了使用OkHttp进行GET和POST请求的具体代码示例,帮助读者理解和实践Eureka服务发现的过程。

 对于一些系统不能接入 eureka server,又需要访问接入eureka server 的服务。

方法一:直接调用服务的地址是一种实现方式,弊端就是地址是写死的,万一服务地址变更则访问不到。

方法二:通过访问 eureka server,发现已经注册的服务地址。然后访问提供服务的主机。

 

在此主要说明一下如何获取注册在 eureka server 上的服务信息。

可以通过 http 请求操作 eureka server,具体信息可以参考官网地址:

https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

 

1) 获取所有服务的信息。

GET 请求: localhost:8000/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();
        }
        
    }

 

HTTP 请求获取 Eureka 服务列表报错 401 通常是由于认证问题导致的,可能是请求未携带正确的认证信息。可以从以下几个方面来解决该问题: ### 检查 Eureka 服务端配置 确保 Eureka 服务端开启了安全认证,并且配置了正确的用户名和密码。参考 Eureka 服务端的配置示例: ```xml spring: application: name: eureka-server security: user: name: user password: password server: port: 8761 eureka: instance: #eureka服务端配置 prefer-ip-address: false # 不使用主机名来定义注册中心的地址,而使用IP地址的形式 status-page-url-path: /actuator/info # 获取此实例状态页的URL路径,然后构造出主机名,安全端口等,默认为/info health-check-url-path: /actuator/health # 获取此实例的相对健康检查URL路径,默认为/health client: #eureka客户端配置 register-with-eureka: false # 实例是否在eureka服务器上注册自己的信息以供其他服务发现,默认为true fetch-registry: false # 此客户端是否获取eureka服务器注册表上的注册信息,默认为true service-url: # 指定服务注册中心的地址 defaultZone: http://user:password@localhost:8761/eureka/ ``` 此配置中设置了用户名 `user` 和密码 `password`,并且在 `defaultZone` 中包含了认证信息 [^2]。 ### 确保请求携带认证信息 在发起 HTTP 请求时,需要在请求头中携带正确的认证信息。例如,使用 Java 的 `HttpClient` 发送请求时,可以这样添加认证信息: ```java import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.Base64; public class EurekaRequestExample { public static void main(String[] args) throws IOException, InterruptedException { String username = "user"; String password = "password"; String auth = username + ":" + password; String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes()); String authHeader = "Basic " + encodedAuth; HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://localhost:8761/eureka/apps")) .header("Authorization", authHeader) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); } } ``` 在这个示例中,通过 Base64 编码生成了认证信息,并将其添加到请求头的 `Authorization` 字段中。 ### 检查客户端配置 如果是客户端代码请求 Eureka 服务列表,要确保客户端配置中包含了正确的认证信息。例如,在 Spring Boot 项目中,Eureka 客户端配置如下: ```yaml eureka: client: service-url: defaultZone: http://user:password@localhost:8761/eureka/ register-with-eureka: true fetch-registry: true instance: prefer-ip-address: true instance-id: ${spring.cloud.client.ip-address}:${server.port} ``` 确保 `defaultZone` 中包含了正确的用户名和密码 [^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值