文章目录
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
server:
port: 8003
servlet:
context-path: /dept-consumer
eureka: # 配置eureka客户端,不用注册到eureka中
client:
serviceUrl:
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/ # eureka的暴露地址,指向集群中每一个eureka,多个用都好分隔
register-with-eureka: false # 只是消费者,因此不用将自己注册到eureka中
@LoadBalanced
,配置如下:import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
* RestTemplate的配置类
* @author 陈加兵
* @since 2018年12月6日 下午6:10:58
*/
@Configuration
public class RestConfig {
@Bean
@LoadBalanced //ribbon实现客户端的负载均衡,默认使用的是轮询的算法
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);//单位为ms
factory.setConnectTimeout(5000);//单位为ms
return factory;
}
}
@EnableEurekaClient
注解@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
@RestController
public class DeptController {
@Resource
private RestTemplate restTemplate;
//请求路径直接使用微服务的名称即可EUREKA-PROVIDER,eureka-provider是微服务的项目名称(servlet.context-path)
private final static String URI_PREFIX="http://EUREKA-PROVIDER/eureka-provider";
/**
* 使用RestTemplate发出get请求
*/
@GetMapping("/dept/{id}")
public Dept getDept(@PathVariable("id")Integer id) throws RestClientException, URISyntaxException{
Map<String, Object> params=new HashMap<String, Object>();
params.put("id", id);
Dept dept = restTemplate.getForObject(URI_PREFIX+"/dept/{id}", Dept.class, params);
return dept;
}
}
EUREKA-PROVIDER
),这个就相当于是一个集群了,需要改变的就是端口
和instance-id
,配置如下:
server: port: 8001 servlet: context-path: /eureka-provider # 访问的项目名称在配置“集群”的时候也是必须一样的,否则不好调用 eureka: client: serviceUrl: defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/ # eureka的暴露地址,直接注册,使用的是eureka的集群 instance: instance-id: eureka-provider:8001 ## instance-id区别服务 prefer-ip-address: true ## 访问路径可以显示服务主机的IP地址 spring: application: name: eureka-provider #微服务的名称,配置集群的时候必须相同
server: port: 8002 servlet: context-path: /eureka-provider # 访问的项目名称在配置“集群”的时候也是必须一样的,否则不好调用 eureka: client: serviceUrl: defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/ # eureka的暴露地址,直接注册,使用的是eureka的集群 instance: instance-id: eureka-provider:8002 ## instance-id区别服务 prefer-ip-address: true ## 访问路径可以显示服务主机的IP地址 spring: application: name: eureka-provider #微服务的名称,配置集群的时候必须相同
http://localhost:8003/dept/-consumer/dept/1
可以发现此时的负载均衡的策略默认使用的是轮询算法RoundRobinRule
:轮询,默认的算法RandomRule
: 随机算法AvailabilityFilteringRule
:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问WeightedResponseTimeRule
:根据平均响应时间计算所有的权重,响应时间越快服务权重越大被选中的概率越高,刚启动时统计信息不足,则使用轮询策略,等统计信息足够,会自动切换到WeightedResponseTimeRuleRetryRule
:先按照轮询策略获取服务,如果服务获取失败则在指定时间内会进行重试,获取可用的服务BestAvailableRule
:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务ZoneAvoidanceRule
:复合判断server所在区域的性能和server的可用性选择服务器import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Ribbon负载均衡算法的配置类
* 1、原理:如果用户没有注入自己的算法,那么ribbon默认使用的是轮询算法,如果注入了,那么将会使用注入的
*/
@Configuration //表明这是一个配置类,相当于配置文件xml
public class RibbonRule {
/**
* 配置随机算法,改变默认的轮询算法
* @return
*/
@Bean
public IRule rule(){
return new RandomRule(); //直接返回随机算法
}
}
ribbon:
ReadTimeout: 5000 # 请求处理时间。
ConnectTimeout: 9000 # 请求连接时间。
ribbon:
OkToRetryOnAllOperations: true #对所有操作都进行重试。
MaxAutoRetriesNextServer: 2 # 切换实例的重试次数。
MaxAutoRetries: 1 # 对当前实例的重试次数。