springcloud-Ribbon 客户端负载均衡技术
ribbon:是一个实现负载均衡的客户端组件
ribbon和eureka整合之后,客户端直接调用,不用关心ip地址。
负载均衡:讲用户的请求分摊到众多服务器,提到效率
客户端微服务:pom.xml
<!-- eureka配置--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!-- ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> <version>1.4.7.RELEASE</version> </dependency>
eureka client开启
使用注解 @EnableEurekaClient
package com.wang.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class DeptConsumer { public static void main(String[] args) { SpringApplication.run(DeptConsumer.class,args); } }
配置修改
server: port: 80 eureka: client: register-with-eureka: false #不像eureka 注册自己 service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
负载均衡开启
导入ribbon依赖之后,可以通过注解开启负载均衡
@LoadBalanced 开启负载均衡
package com.wang.springcloud.config; 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 ConfigBean { @Bean // 配置负载均衡请求 @LoadBalanced //Ribbon public RestTemplate restTemplate(){ return new RestTemplate(); } }
controller 访问服务的url变动
之前是写死,直接访问服务提供端的url,ribbon 之后,使用服务名称,ribbon自己根据服务名称路由对应可用的服务,通过eureka访问。
private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT" ;
package com.wang.springcloud.controller; import com.wang.springcloud.pojo.Dept; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.xml.crypto.KeySelector; import java.util.List; @RestController public class DeptConsumerController { //消费者,不应该有service层 //RestTemplate @Autowired private RestTemplate restTemplate; //访问服务端url 这里写死的,做不到负载均衡效果 // private static final String REST_URL_PREFIX = "http://localhost:8001" ; // 由于之前已经通过eureka实现服务的集群,这里通过服务名访问 private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT" ; @RequestMapping("/consumer/dept/add") public boolean add(Dept dept){ //参数1:url //参数2: post方式,请求入参 //参数3:返回类型 return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class); } @RequestMapping("/consumer/dept/get/{id}") public Dept get(@PathVariable("id") int id){ return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class); } @RequestMapping("/consumer/dept/list") public List<Dept> queryAll(){ return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class); } }
测试:
通过客户端访问
上一篇:
IDEA上Java项目控制台中文乱码