发表于: 2020-09-17 23:49:52

1 1479


今天完成的事:

RestTemplate和Ribbon来消费服务。


RestTemplate是spring Resource中访问第三方RESTful API 接口的网络请求框架。RestTemplate的设计原则和其他的spring Template(例如,JdbcTemplate)类似,都是为执行复杂任务提供了一个具有默认行为的简单方法。

RestTemplate是用来消费REST服务的,所以RestTemplate的主要方法都与REST的http协议的一些方法紧密相连,例如GET,POST,PUT,DELETE等方法,这些方法再RestTemplate类对应的方法为headForHeaders()、getforObject()、put()、delete()等


负载均衡是指将负载分摊到多个执行单元上,常见分负载均衡有两种方式,一种是独立进程单元,通过负载均衡的策略,将请求转发到不同的执行单元上,例如Nginx。另一种是将负载均衡逻辑以代码的形式封装到服务消费消费者的客户端上,服务消费者客户端维护了一份服务提供者的信息列表,有了信息列表,通过负载均衡策略将请求分摊到多个服务提供者,从而达到负载均衡的目的。

 Rinbbon是Netfilx公司开源的一个负载均衡的组件,它属于上述的第二种方式,是将负载均衡逻辑封装在客户端中,并且运行在客户端的进程里。


新建立一个eureka-Ribbon-client模块

pom文件加了ribbon依赖,其他的跟普通client模块一样。

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

将Ribbon和RestTemplate结合在一起,只需要在程序的Ioc容器中注入一个restTemplate的bean,并在Bean上加上@LoadBalanced注解。

@Configuration
public class RibbonConfig {
   @Bean
   @LoadBalanced
   RestTemplate restTemplate(){
      return new RestTemplate();
   }
}


写一个RinbbonService类,在该类的hi()方法用restTemplate调用eureka-client的Api接口,此时Url中不需要使用硬编码(例如ip地址),只需要写服务名eureka-client。

@Service
public class RibbonService {
@Autowired
   RestTemplate restTemplate;
   public String hi(String name){
return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class);
   }
}

创建一个Controller调用RibbonService的方法

@RestController
public class RibbonController {
@Autowired
   RibbonService ribbonService;
   @RequestMapping("/hi")
public String h1(@RequestParam(required = false,defaultValue = "springcloud") String name){
return ribbonService.hi(name);
   }
}

设置同一个eureka-client通过不同的端口启动两个实例

然后依次启动server,client两个实例,ribbon实例。

在浏览器上多次访问http://localhost:8764/hi ,浏览器会轮流显示如下内容:

hispringcloud, i am from port:8762

hispringcloud, i am from port:8763

负载均衡器的核心类为LoadBalancerClient,它可以获取负载均衡的服务提供者的实例信息。

@Autowired
private LoadBalancerClient loadBalancerClient;
@RequestMapping("/testRibbon")
public String testRibbon(){
ServiceInstance serviceInstance=loadBalancerClient.choose("eureka-client");
   return serviceInstance.getHost()+":"+serviceInstance.getPort();
}

重新启动工程:

浏览器轮流显示下面的内容:

localhost:8763

localhost:8764

明天的计划:

feign demo

遇到的问题:

收获:

Ribbon和RestTemplate的结合使用。


返回列表 返回列表
评论

    分享到