基本概念
- LB负载均衡(load balance)
将用户请求分配平摊的的分配到多个服务上,从而得到系统的HA(高可用)
常见负载均衡软件:nginx,lvs,slb
-
ribbon本地负载均衡客户端(进程内)与nginx服务器端负载均衡(集中式)区别
- nginx:客户端将请求交给nginx,由nginx进行转发,即负载均衡是由服务队实现的
- ribbon:在调用微服务接口的时候,会在注册中心上获取注册信息之后缓存到jvm本地,从而在本地实现rpc远程服务调用技术
-
策略
- 引入
代码实现
- 说明
简而言之,就是负载均衡+restemplate
postForObject: 返回对象为json
postForEntities:返回信息包括状态码,通过getBody得到Object信息
- 写pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 加负载均衡+RestTemplate
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
- 启动Eureka client
@SpringBootApplication
@EnableEurekaClient
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
- controller实现
@Resource
private RestTemplate restTemplate;
private static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
@PostMapping("/create")
public CommonResult<Payment> createPayment(@RequestBody Payment payment) {
return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
}
规则替换
注意:不能放在@CompomentScan注解下的包和子包下,因为这个主机定义在@SpringBootApplication下,所有不能在在main类的包下,所有重新弄一个包(Main方法在com.fuzhiwei.cloud包,此rule在com.fuzhiwei.rule包下)
- 写rule
@Configuration
public class MyselfRule {
@Bean
public IRule MyRule() {
return new RandomRule();
}
}
- 添加注解
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MyselfRule.class)
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}