SpringCloudEureka服务发现的集成、配置和部署(3):Eureka客户端——消费者

前言

上一篇:SpringCloudEureka服务发现的集成、配置和部署(2):Eureka客户端——服务提供者

“Eureka消费者”与“Eureka服务提供者”一样,都是从“Eureka客户端”所分化出来的两个逻辑概念。本质上,一个“Eureka客户端”即可以是服务提供者,又可以是消费者。

“消费者”的概念主要体现在以代码的形式,向其它的Eureka客户端发起请求,以获取对方所提供的数据信息。原则上这仅仅是一种基于web网络通信协议的restful风格的api调用,但是在Eureka架构的基础上,在发起该调用的时候,消费者可以不用关心服务提供者所在的ip地址是多少,仅仅通过对方的服务名就能够完成连接。

依赖和配置

由上文所述,Eureka消费者本质上仍然是一个Eureka客户端,因此其依赖包和配置完全就是Eureka客户端的配置。详细的配置过程可以查看:SpringCloudEureka服务发现的集成、配置和部署(2):Eureka客户端——服务提供者

代码实现

很多网络上的入门教程都会以Get的方式来介绍怎样编程实现“消费”。但对于我个人来说,处于各种各样的原因,依旧愿意使用Post的方式来发起网络请求,并且并不希望将请求的参数格式固定为Json或其它某种格式,而是选择原始通信数据格式,这样能够 拥有更好的扩展性和兼容性。

在Eureka和Spring框架体系中,可以通过RestTemplate类来完成网络通信和数据投递。但在这之前,我们需要将服务提供者那一方的Controller调整为Post方式:

@Controller
@RequestMapping("/hello")
public class HelloController  {
    //...

    @RequestMapping(value = "execute" , method = RequestMethod.POST)
    @ResponseBody
    public String execute(HttpServletRequest request){
        BufferedReader bufferedReader = new BufferedReader (new InputStreamReader(request.getInputStream()));
        
        //...
        
    }

}

在Controller的内部请求映射方法上,使用“@RequestMapping”的参数“method”来指明参数投递方式为Post,并且在方法体的内部,通过BufferReader类来获取请求体中所包含的数据流。这些数据流可以根据实际的情况来进行类型转换,例如json格式或是xml字符串。

之后,在消费者一方,我们需要在SpringBoot启动类中添加以下的代码:

/**
 * 实例化RestTemplate,用于Eureka调用
 * @return
 */
@LoadBalanced
@Bean
public RestTemplate rest() {
    return new RestTemplate();
}

上述代码中的注解“@LoadBalanded”允许我们开启Eureka的服务负载均衡,这会允许我们将多个独立的Eureka客户端以相同的服务名称注册,这些独立的客户端可能具备相同的功能。然后消费者在调用服务时,Eureka会根据实际情况为我们挑选目标,从而实现负载均衡。

完成这一代码之后,就可以在其他需要的地方,使用RestTemplate了。在这一示例中,我将它放置在了Controller层面中:

@Controller
public class HelloController  {
    //...
	
    @Autowired
    RestTemplate restTemplate;

    //...
}

然后,通过它发起基于Http的Post投递:

@RequestMapping(value = "getFromEurekaServiceProvider1" , method = RequestMethod.POST)
@ResponseBody
public String getFromEurekaServiceProvider1(HttpServletRequest request){
    //...

    String url = "http://eurekaServiceProvider1/freezingSpringBootEurekaServiceProvider1/hello/execute";

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.TEXT_PLAIN);
    HttpEntity httpEntity = new HttpEntity(requestParameter,headers);
		    
    ResponseEntity<String> response = restTemplate.postForEntity( url, httpEntity , String.class );
		    
    String responseStr = response.getBody();

    //...
}

从上面的代码中,可以观察到,我们在连接Eureka服务提供者的时候,并没有使用ip地址和端口号去连接,而是使用了其服务名“eruekaServiceProvider1”。

接下来就是测试。在这一测试中,我使用了三个独立的Tomcat,其关系和配置如下:

Eureka服务端:Tomcat#0,端口号6080

Eureka客户端1:Tomcat#1,端口号6180,服务名eurekaServiceProvider1

Eureka客户端2:Tomcat#2,端口号6280,服务名eruekaServiceProvider2

其中,客户端1将扮演服务提供者,而客户端2将扮演消费者。首先先启动Erueka服务端:

然后在启动其一个客户端,即服务提供者:

最有一个客户端,即消费者,为了明显区分,我直接在MyEclipse中启动了它:

先通过Eureka服务端面板来观察一下:

两个客户端全部都启动了。

最后,使用postman进行投递测试:

请求的地址指向的是第二个客户端,也就是消费者的一个Controller,在这个Controller内部,通过RestTemplate向第一个客户端发送请求,并从它那里获得了响应数据。由此,一个最为简单的Eureka服务注册和发现模型就完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值