上一节我们搭建了单节点的Eureka和一个provide-server的服务,这一次我们再新创建一个consume-server,然后使用RestTemplate实现服务之间的调用。
1、创建consume-server服务
服务创建过程就不一一描述了,这里贴一下application.yml
server:
port: 40001
spring:
application:
name: CONSUME-SERVER
eureka:
instance:
appname: CONSUME-SERVER
client:
service-url:
defaultZone: http://127.0.0.1:20001/eureka/
同样的,在consume-server服务的启动类加上能被服务发现的注解@EnableDiscoveryClient,完成之后启动注册中心以及consume-server和provide-server两个服务:
红框中的内容大家现在可以不用关心,这个是Eureka的高可用实现,下一节会和大家分享。
启动完成之后,现在开始实现服务的调用。
首先在provide-server中创建一个ProvideController.java和一个方法,我们会在consume-server中远程调用这个方法
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import priv.cwr.model.entity.UserEntity;
/**
* User: R
* Date: 2018/10/16
* Time: 17:03
* Created with IntelliJ IDEA.
*/
@RestController
@RequestMapping("/provide")
public class ProvideController {
/**
* 查询单个用户
*
* @return
*/
@GetMapping("/find-one-user")
public UserEntity findAllUser() {
System.out.println("/find-one-user");
return new UserEntity(1001L, "张三");
}
}
UserEntity.java
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* User: R
* Date: 2018/10/16
* Time: 17:02
* Created with IntelliJ IDEA.
*/
@Data
@AllArgsConstructor
public class UserEntity {
private Long userId;
private String name;
}
然后再在consume-server中创建一个ConsumeController.java和一个测试方法,其中两个服务的UserEntity是一样的
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import priv.cwr.controller.model.entity.UserEntity;
/**
* User: R
* Date: 2018/10/16
* Time: 17:01
* Created with IntelliJ IDEA.
*/
@RestController
@RequestMapping("/consume")
public class ConsumeController {
private final RestTemplate restTemplate;
public ConsumeController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
/**
* 测试远程服务调用
*
* @return
*/
@GetMapping("/remote-test")
public UserEntity findOneUser() {
//第一个参数是请求地址,第二个参数是返回的数据类型
ResponseEntity responseEntity = this.restTemplate.getForEntity(
"http://PROVIDE-SERVER/provide/find-one-user", UserEntity.class
);
return responseEntity.getBody();
}
}
要使用RestTemplate必须在调用方(消费方)的启动类中加上如下配置(一个方法):
/**
* 默认RestTemplate
*/
//开启负载均衡,如何没有该注解则不会走Eureka,
//就会发现不了服务,出现UnknownHostException异常
@LoadBalanced
@Bean //必须new 一个RestTemplate并放入spring容器当中,否则启动时报错
public RestTemplate restTemplate() {
return new RestTemplate();
}
完成之后,重新启动两个服务,访问http://127.0.0.1:40001/consume/remote-test
使用RestTemplate进行简单的服务调用这样就完成了,RestTemplate还有很多功能,感兴趣的话大家可以自己好好研究一下。
2、客户端负载均衡(Ribbon)
刚才实现的是单节点服务的调用,现在再多开启两个provide-server服务(端口:30002和30003),模拟一个provide-server服务的集群,然后通过负载均衡的方式去调用服务(需要加上@LoadBlanced注解,引入Ribbon)。
新启动两个provide-server服务:
多访问几次http://127.0.0.1:40001/consume/remote-test,然后查看provide-server服务的三个控制台
Ribbon默认的负载均衡策略是轮询的方式,所以这时候通过控制台的输出顺序可以看的出负载均衡的效果。