微服务:服务注册
作者:互联网
- 服务注册
将一个服务注册给eureka
- 引入依赖(与上一个依赖相近,但不相同。)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 编写springboot配置文件
spring:
application:
name: userservice #orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
修改OrderService的代码
- 将写死的url用服务名来代替。
//原来
String url="http://localhost:8081/user/"+order.getUserId();
//现在
String url="http://userservice/user/"+order.getUserId();
- 给RestTemplate添加
@LoadBananced
注解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
原理:
- 请求会被负载均衡拦截器拦截(
LoadBalancerInterceptor
),通过调用getHost()方法获取请求名称。 - 通过
RibbonLoadBalancerClient的execute()
方法获取eureka中的serviceList
- 然后通过
getService
方法完成负载均衡 - 在之后调用
ZoneAwareLoadBalancer中的chooseServer()
方法来调用父类BaseLoadBalancer
中的同名方法。 - 最终会根据IRule类型的对象rule来指定负载均衡策略。默认roundRobinRule
- ClientConfigEnabledRoundRobinRule
- RoundRobinRule(轮询策略)
- RandomRule(随机策略)
- RetryRule
- 最终拿到服务信息。
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
标签:负载,服务,server,serviceId,注册,userservice,eureka,加载 来源: https://www.cnblogs.com/Boerk/p/15938364.html