项目地址:https://github.com/gongxianshengjiadexiaohuihui/SpringCloudDemo
RestTemplate 是 Spring Resources 中一个访问第三方 Restful API 接口的网络请求框架。
RestTemplate 是用来消费 REST 服务的,所以 RestTemplate 的主要方法都与 REST 的 H即 协议的一些方法紧密相连,例如 HEAD、 GET、 POST、 PUT、 DELETE 和 OPTIONS 等方法, 这些方法在 RestTemplate 类对应的方法为 headFor Headers()、 getForObject()、 postForObject()、 put()和 delete(),RestTemplate 支持常见的 Http 协议的请求方法,例如 Post、 Put、 Delete 等,所以用 RestTemplate 很容易构建 Restful API
接着谈一下什么是负载均衡,负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式。 一种是独立进 程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix。另一种是将负载 均衡逻辑以代码的形式封装到服务消费者的客户端上,服务消费者客户端维护了一份服务提供 者的信息列表,有了信息列表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负 载均衡的目的。如何Netflix公司的Ribbon
还是用接着上一节的代码进行扩展,不过要添加一个Module工程,名字为eureka-ribbon-client,作为服务消费者,通过RestTemplate来消费eureka-client的服务,先为erureka-client创建一个服务
@RestController
public class HiController {
@Value("${server.port}")
String port;
@GetMapping("/hi")
public String home(@RequestParam String name){
return "hi "+name+",i am from port:" +port;
}
}
eureka-ribbon-client的pom文件
4.0.0
com.example
eureka-ribbon-client
0.0.1-SNAPSHOT
jar
eureka-ribbon-client
Demo project for Spring Boot
spring-cloud
eureka
1.0-SNAPSHOT
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-ribbon
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
eureka-ribbon-client配置文件
spring:
application:
name: eureka-ribbon-client
server:
port: 8764
eureka:
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/
配置RestTemplate的负载均衡策略
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
利用RestTemplate去消费服务
@Service
public class RibbonService {
@Autowired
RestTemplate restTemplate;
public String hi(String name){
return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class);
}
}
Controller层
@RestController
public class RibbonController {
@Autowired
RibbonService ribbonService;
@GetMapping("/hi")
public String hi(@RequestParam(required=false,defaultValue="ggp") String name){
return ribbonService.hi(name);
}
}
配置完成了 然后就是我们的启动类 和eureka-client一样,因为他们都是客户端,但是既可以是服务提供者,又可以是服务消费者,可以看一下我上一篇发的图
@SpringBootApplication
@EnableEurekaClient
public class EurekaRibbonClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaRibbonClientApplication.class, args);
}
}
还是向上一篇一样启动两个server,不过这次eureka-client要启动两个,这样才能体现我们的负载均衡。
启动第二个eureka-client的时候需要更改端口号
去掉Single instantce only 前面的对号就可以了
最后启动eureka-ribbon-client
启动成功后我们两个server都可以看到,这些服务已经被注册
红色部分是eureka的自我保护模式,可以参考我的第一篇。
接着访问http://localhost:8764/hi?name=ggp
会发现,eureka-ribbon-client会交替的访问8762和8763这两个端口,说明负载均衡策略已经生效
此时的结构如下图
负载均衡器的核心类为 LoadBalancerClient, LoadBalancerClient 可以获取负载均衡的服务提 供者的实例信息
验证一下
在eureka-ribbon-client的controller加一部分代码
@RestController
public class RibbonController {
@Autowired
RibbonService ribbonService;
@GetMapping("/hi")
public String hi(@RequestParam(required=false,defaultValue="ggp") String name){
return ribbonService.hi(name);
}
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("test")
public String testRibbon(){
ServiceInstance serviceInstance=loadBalancerClient.choose("eureka-client");
return serviceInstance.getHost()+":"+serviceInstance.getPort();
}
}
启动访问http://localhost:8764/test
负载均衡 器 LoadBalancerClient 是从 Eureka Client 获取服务注册列表信息的,并将服务注册列表信息缓存 了一份。 在 LoadBalancerCJient 调用 choose()方法时,根据负载均衡策略选择一个服务实例的 信息,从而进行了负载均衡。 LoadBalancerClient 也可以不从 Eureka Client获取注册列表信息, 这时需要自己维护一份服务注册列表信息。
参考资料:《深入理解spring+cloud与微服务构建》