上一篇总结了Eureka,并且创建了一个客户端provider,这次总结一下ribbon,实现微服务负载均衡。
Spring Cloud Ribbon介绍
一个客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访问控制。
客户端负载均衡即是当浏览器向后台发出请求的时候,客户端会向 Eureka Server 读取注册到服务器的可用服务信息列表,然后根据设定的负载均衡策略(没有设置即用默认的),抉择出向哪台服务器发送请求。
Ribbon负载均衡实现
Ribbon子项目搭建
接着上一篇再创建一个子项目consumer-ribbon
pom文件其他都一样,引入ribbon
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
yml配置
eureka:
client:
serviceUrl:
defaultZone: http://eureka01:8800/eureka/,http://eureka02:8810/eureka/
server:
tomcat:
uri-encoding: UTF-8
port: 10001
# servlet:
# context-path: /gbq_consumer_ribbon
spring:
application:
name: consumer_ribbon
注意,不要配置context-path 或者server-path,这样当你的微服务被调用时,会出现找不到的报错!如果非要加,请自行百度一下,我查到的并不太好使!
启动类@SpringBootApplication
//@EnableDiscoveryClient //从Spring Cloud Edgware开始,@EnableDiscoveryClient 或@EnableEurekaClient 可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。
public class ConsumerRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerRibbonApplication.class, args);
}
//开启restTemplate负载均衡
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
/**
* 配置随机负载策略,需要配置属性service-B.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
*/
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
}
Controller
@RestController
public class HiController {
@Autowired
private HiService hiService;
@GetMapping("/hi")
public String sayHello(String name){
return hiService.sayHello(name);
}
}
Service实现类
@Service
public class HiServiceImpl implements HiService {
@Autowired
private RestTemplate restTemplate;
@Override
public String sayHello(String name) {
String url = "http://provider/hello?name="+name;
return restTemplate.getForObject(url,String.class);
}
}
这样ribbon就新建完毕了。
那么ribbon需要调用provider提供者服务的hello接口,我们需要再provider这个项目中写这么一个接口!
provider子项目接口实现
controller
@RestController
public class HelloController {
@Value("${server.port}")
private int port;
@GetMapping("/hello")
public String sayHello(String name){
return "你好,cloud"+"name:"+name+"port:"+port;
}
}
你要实现负载均衡,那么还需要一个provider提供者服务作为参照,结果才能明显
provider-copy子项目搭建
直接复制一份provider,修改名字和yml配置即可
eureka:
client:
serviceUrl:
defaultZone: http://eureka01:8800/eureka/,http://eureka02:8810/eureka/
instance:
prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
server:
tomcat:
uri-encoding: UTF-8
port: 9902 #改变端口号即可
# servlet:
# context-path: /gbq_provider
spring:
application:
name: provider #名称需要一样
注意:只要修改端口即可
其他都一样。
启动咱们看一下负载均衡的效果,这里拿postman测试!
端口号,看到变化了吧!!!