在上一节中,我们成功的将微服务注册到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的客户端负载均衡策略,实现了一个相对完整的微服务架构。