spring|springcloud之ribbon的使用

springcloud-ribbon是什么? ribbon是netflix开发的一套负载均衡的工具,只要为ribbon提供应用程序名,就可以实现负债均衡。ribbon提供了很多负载均衡算法。也就是com.netflix.loadbalancer.IRule接口的实现类。我们也可以自己定义负载均衡算法。
ribbon架构图 【spring|springcloud之ribbon的使用】spring|springcloud之ribbon的使用
文章图片

ribbon具体代码实现 1.首先我们需要一个eureka注册中心,最少两个服务提供者,一个服务消费方。
项目结构:
spring|springcloud之ribbon的使用
文章图片

2.客户端我们需要导入eureka客户端的pom文件,因为eureka-client已经包含了ribbon的包了,所以不用重复导入。

org.springframework.cloud spring-cloud-starter-netflix-eureka-client

可以看到包含关系
spring|springcloud之ribbon的使用
文章图片

3.在往spring容器里面注入RestTemplate的时候,加上注解LoadBalanced可以通过服务名访问服务提供者,并支持负载均衡。
import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ApplicationConfig {@Bean @LoadBalanced // 多个服务提供者可以轮询调用 public RestTemplate restTemplate(){ return new RestTemplate(); }}

4.有了LoadBalanced注解,我们可以不用写ip地址,直接写应用的名称。比如我们有两个一样的服务只是端口号不同,那就可以通服务名去调用服务。
import com.xx.job.common.CommonResult; import com.xx.job.entity.Payment; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import java.util.List; @RestController @RequestMapping("/consumer") public class ConsumerController {// 有了LoadBalanced注解,我们可以不用写ip地址,直接写应用的名称。 // 比如我们有两个一样的服务只是端口号不同,那就可以通服务名去调用服务。 public static final String URI = "http://SPRING-CLOUD-PAYMENT"; @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @GetMapping("/selectById/{id}") public CommonResult selectById(@PathVariable Long id){ ResponseEntity forEntity = restTemplate.getForEntity(URI + "/payment/selectById/" + id, CommonResult.class); CommonResult body = forEntity.getBody(); return body; }@GetMapping("/insert") public CommonResult insert( Payment payment){ ResponseEntity forEntity = restTemplate.postForEntity(URI + "/payment/insert", payment, CommonResult.class); return forEntity.getBody(); }@GetMapping("/discovery") public Object discoveryClient(){ List services = discoveryClient.getServices(); services.forEach(x->{ System.out.println(x); }); List instances = discoveryClient.getInstances("SPRING-CLOUD-PAYMENT"); instances.forEach(x->{ System.out.println(x.getHost()); System.out.println(x.getInstanceId()); System.out.println(x.getPort()); System.out.println(x.getServiceId()); System.out.println(x.getUri()); System.out.println(x.getMetadata()); System.out.println(x.getScheme()); System.out.println("------------------------"); }); return discoveryClient; } }

5.Ribbon更换默认负载均衡算法 RandomRule(随机)
注意:默认算法配置类不能放到@ComponentScan注解同级或者子级。
import com.netflix.loadbalancer.RandomRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyRandomRule {@Bean public RandomRule randomRule(){ return new RandomRule(); }}

负载均衡算法有哪些
spring|springcloud之ribbon的使用
文章图片



启动类配置RibbonClient注解,name要调用的服务提供者,configuration负载配置类
import com.xx.MyRule.MyRandomRule; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.RibbonClients; @EnableDiscoveryClient @EnableEurekaClient @SpringBootApplication @RibbonClient(name = "SPRING-CLOUD-PAYMENT",configuration = MyRandomRule.class) public class OrderConsumer80 { public static void main(String[] args) { SpringApplication.run(OrderConsumer80.class,args); } }

6.完成,测试
git地址:spring-cloud-demo: spring-cloud-demo试例

    推荐阅读