Spring Cloud微服务实战---1.8.Eureka下的服务调用

11 篇文章 1 订阅
11 篇文章 0 订阅

在上一节中,我们成功的将微服务注册到Eureka中,并实现了Eureka的高可用性,在这一节中,我们将实现一个微服务使用者程序,通过查询Eureka找到微服务,然后调用根据一定的负载均衡算法,调用相应的微服务实例,完成自己所需的功能。
因为在高可用环境下,Eureka服务注册中心会发送心跳信息,确认Eureka微服务注册中心的健康状态,这样会刷新页面,非常影响我们的正常开发工作,所以我们需要采用命令行方式启动微服务注册中心和微服务提供者。
注意:在运行下面的命令之前请确认配置好了JAVA_HOME和MVN_HOME环境变量。
进入service-registry项目根目录,运行如下命令:

mvn install

初次运行这个命令会花一些时间,运行成功之后,会在target目录下生成对应的jar文件。进入target目录,启动两个Eureka微服务注册中心:

java -jar service-registry-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar service-registry-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

接下来我们生成服务提供者,进入mse项目根目录,运行如下命令:

mvn install

运行成功后,会在target目录下生成jar文件。进入target目录,启动第一个服务提供者实例:

java -jar mse-0.0.1-SNAPSHOT.jar --management.server.port=8008 --server.port=8443
java -jar mse-0.0.1-SNAPSHOT.jar --management.server.port=8009 --server.port=8444

成功运行后,会显示如下界面:
在这里插入图片描述
如上图所示,会显示有两个Eureka微服务注册中心和两个微服务提供者实例。
接下来我们开始开发微服务调用者product-consumer,首先在项目pom.xml文件中添加客户端负载均衡依赖,如下所示:

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
		</dependency>

在启动程序ProductConsumerApplication类中,添加如下代码:

@EnableDiscoveryClient
@SpringBootApplication
public class ProductConsumerApplication {
	@Bean
	@LoadBalanced
	RestTemplate restTemplate() {
		return new RestTemplate();
	}

	public static void main(String[] args) {
		SpringApplication.run(ProductConsumerApplication.class, args);
	}
}

因为我们要调用Eureka管理的服务,所以需要添加@EnableDiscoveryClient注解。我们需要使用客户端负载均衡技术,因此需要给RestTemplate函数添加@Bean、@LoadBalanced注解。
在具体的接口实现中需要调用其他微服务提供的功能,代码如下所示:

@RestController
public class ProductConsumerController {
	@Autowired
	RestTemplate restTemplate;
	
	@RequestMapping(value="/product-consumer", method=RequestMethod.GET) 
	public String callServiceExample() {
		return restTemplate.getForEntity("http://mse001/products", String.class).getBody();
	}
}

在实际应用中,请求的微服务可能需要参数,可以写为如下形式:

restTemplate.getForEntity("http://YOUR-SERVICE-NAME/{1}/{2}/{3}", String.class, "abc", "1.5", "2.0");

在上面的代码中,YOU-SERVICE-NAME替换需要调用的服务名称,{1}、{2}、{3}为请求需要的参数占位符,调用最后的"abc"、“1.5”、"2.0"为所需要的参数。
如果服务调用返回结果可以直接对应到一个值对象,可以写成如下形式:

ResponseEntity<ProductVo> responseEntity = restTemplate.getForEntity(
			"http://YOUR-SERVICE-NAME/{1}/{2}/{3}", String.class, 
			"abc", "1.5", "2.0");
ProductVo vo = responseEntity.getBody();

当需要调用的微服务是POST方法时,可以采用相应的post方法:

restTemplate.postForEntity("http://mse001/products/{1}/{2}", 
			productVo, String.class, param1, param2).getBody();

对于put方法,可以采用如下代码:

restTemplate.put("http://YOUR-SERVICE-NAME/{1}/{2}", 
			prodcutVo, param1, param2);

对于delete方法调用方法如下所示:

restTemplate.delete("http://YOUR-SERVICE-NAME/{1}/{2}", 
			param1, param2);

截止目前为止,我们成功创建了Eureka微服务注册与管理中心,同时通过Eureka来调用具体的服务提供者,服务使用者采用基于Ribbon的客户端负载均衡策略,实现了一个相对完整的微服务架构。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值