将一个服务注册给eureka
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
spring: application: name: userservice #orderservice eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka
修改OrderService的代码
//原来 String url="http://localhost:8081/user/"+order.getUserId(); //现在 String url="http://userservice/user/"+order.getUserId();
@LoadBananced
注解@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
原理:
LoadBalancerInterceptor
),通过调用getHost()方法获取请求名称。RibbonLoadBalancerClient的execute()
方法获取eureka中的serviceList
getService
方法完成负载均衡ZoneAwareLoadBalancer中的chooseServer()
方法来调用父类BaseLoadBalancer
中的同名方法。public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint) throws IOException { ILoadBalancer loadBalancer = getLoadBalancer(serviceId);//获取serviceList Server server = getServer(loadBalancer, hint); if (server == null) { throw new IllegalStateException("No instances available for " + serviceId); } RibbonServer ribbonServer = new RibbonServer(serviceId, server, isSecure(server, serviceId), serverIntrospector(serviceId).getMetadata(server)); return execute(serviceId, ribbonServer, request); }
自定义负载均衡策略
通过代码方式
通过配置类,往IOC容器中添加一个IRole组件,可以将任何一个它的实现作为返回值返回。
@Bean public IRule setIRule(){ return new RandomRule(); }
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
rebbin的饥饿加载模式
ribbon: eager-load: enabled: true #默认值为false,为懒加载。 clients: userservice #指定对谁进行饥饿加载 # clients是一个List集合,如果需要对多个服务进行饥饿加载使用yaml的写法,即, # clients: # - userservice # - userservice