SpringCloud之Ribbon(客户端负载均衡)
SpringCloud之Ribbon(客户端负载均衡)
通过Eureka服务治理框架,我们可以通过服务名来获取具体的服务实例的位置了(IP),一般在使用SpringCloud的时候不需要自己手动创建HttpClient来进行远程调用,我们可以使用Spring封装好的RestTemplate工具类进行远程调用,使用Ribbon进行客户端负载均衡
一.使用RestTemplate发送请求+客户端负载均衡(Ribbon)
步骤:
1.在启动类中添加RestTemplate的bean
2.注入RestTemplate,定义静态常量URL
public static final String PRODUCT_URL = "http://PRODUCT-SERVER";
3.调用方法,类似于发短信的方式,发起http请求
Product product = template.getForObject(PRODUCT_URL + "/products/get/" + productId, Product.class);//远程获取
4.通过value注解可以查看是哪个端口被调用了
@Value("${server.port}")
private String port;
1.代码
@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {
@Autowired
private RestTemplate template;
//传统方式存在问题:写死ip端口,后续如果做了集群,那么这种方式就无法使用集群中其他的服务了
//比如8081 8082等端口
//public static final String PRODUCT_URL = "http://localhost:8080";
//Eureka中服务名
public static final String PRODUCT_URL = "http://PRODUCT-SERVER";
@Override
public Product save(Long userId, Long productId) {
log.info("OrderServiceImpl.save....");
//远程获取
Product product = template.getForObject(PRODUCT_URL + "/products/get/" + productId, Product.class);
return product;
}
}
//使用restTemplate访问restful接口非常的简单粗暴无脑。
//(url, requestMap, ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
//因为进行负载均衡调用,此时需要用的是Eureka中product-server服务名
//而Eureka中可以通过服务名获取到product-server所有服务集群的ip与端口
---------------------------------------------------------------------------------------
启动类
@SpringBootApplication
@EnableEurekaClient
public class OrderMain8090 {
@Bean
@LoadBalanced //负载均衡
public RestTemplate template(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderMain8090.class, args);
}
}
2.yml文件
server:
port: 8090
spring:
application:
name: order-server
eureka:
client:
#是否将自己注册进去eureka,false为不注册,true注册
registerWithEureka: true
#是否从eureka抓取注册信息,单点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
#设置轮询策略
PRODUCT-SERVER: #必须是provide的服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
#注意:服务的名称需要和代码中的服务名称一致,不然是修改不了负载均衡策略.
3.pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--可加可不加, eureka-client客户端默认引入ribbon依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
二.什么时候需要使用Ribbon?
例如在进行秒杀项目时,为了实现服务的高可用,我们可以将服务提供者集群,当使用集群后,我们就需要将用户请求进行合理的分配,就是说将请求分给对应请求压力小的服务器,这就叫做负载均衡,SpringCloud中实现这一功能的就是Ribbon
三.负载均衡策略调整
#Ribbon中默认负载均衡的策略为轮询模式
#我们可以通过修改yml文件,修改策略
#设置轮询策略
PRODUCT-SERVER: #必须是provide的服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
#注意:服务的名称需要和代码中的服务名称一致,不然是修改不了负载均衡策略.
负载均衡策略种类
四.小结
1.负载均衡原理:客户端从Eureka Server中得到一份服务清单(ip端口),在发送请求时通过负载均衡算法,
在多个服务器之间选择一个进行访问
2.远程调用使用RestTemplate工具类时,需要将该bean交给spring容器管理并贴上 @LoadBalanced 负载均衡注解
3.一般集群时就需要使用到客户端负载均衡(Ribbon),还有一种服务端负载均衡(Nginx)
4.可以通过配置yml文件设置负载均衡策略
还没有评论,来说两句吧...