对于任何一个高可用高负载的系统来讲,负载均衡是一个必不可少的名称。在大型分布式计算体系中,某个服务在单例的状况下,很难应对各类突发状况。所以,负载均衡是为了让系统在性能出现瓶颈或者其中一些出现状态下能够进行分发业务量的解决方案。在SpringCloud 体系当中,加入了Netflix公司的不少优秀产品,其中一个就是针对于服务端进行负载均衡的Ribbon。html
【微服务】轻松搞定SpringCloud微服务目录
本系列为连载文章,阅读本文以前强烈建议您先阅读前面几篇。java
负载均衡:英文名称为Load Balance, 创建在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增长吞吐量、增强网络数据处理能力、提升网络的灵活性和可用性。其意思就是分摊到多个操做单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工做任务。
负载均衡带来的好处很明显:git
Ribbon是Netflix开源的一款用于客户端软负载均衡的工具软件。Spring Cloud对Ribbon进行了一些封装以更好的使用Spring Boot的自动化配置理念。github
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它能够经过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的做用。web
起飞以前,先说明一下,本项目前几篇文章中已经构建了相关子项目包括:注册中心、配置中心。本文中继续可使用。spring
须要建立两个如出一辙的服务器,让客户端按照不一样的机制进行分发,达到负载均衡的效果。咱们约定两个子项目名称:
cloud-hyh-service-1 端口号:8071
cloud-hyh-service-2 端口号:8072
对于服务名称设置同样:cloud-service ,其余业务都同样,能够复制。【端口号不同】api
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
#服务注册中心配置 eureka: client: service-url: defaultZone: http://localhost:8081/eureka/ instance: appname: cloud-service lease-renewal-interval-in-seconds: 1 server: port: 8071 spring: application: name: cloud-service
#服务注册中心配置 eureka: client: service-url: defaultZone: http://localhost:8081/eureka/ instance: appname: cloud-service server: port: 8072 spring: application: name: cloud-service
说明:与配置一其实基本同样,只不过将端口号配置成 8072服务器
/** * @Description : * @Author hanyahong * @Date 2017/12/7- 17:35 */ @SpringBootApplication @EnableDiscoveryClient public class ServiceTwoApplication { public static void main(String[] args) { SpringApplication.run(ServiceTwoApplication.class, args); } }
/** * @Description :测试RibbonTest API * @Author hanyahong * @Date 2017/12/7- 17:40 */ @RestController @RequestMapping(value = "/ribbon") public class RibbonTestApi { /** * 获取博客名称API * * @return 相关信息 */ @RequestMapping(value = "name", method = RequestMethod.GET) public String getMyBlogNameApi() { return "千万之路刚开始-www.hanyahong.com-beijing"+"该服务器端口号:8071"; } } 备注:两台服务器,除了返回的服务器端口号 8071 8072不一样以外,其余都相同,就是为了看到效果。
建立一个子项目,cloud-hyh-ribbon-client ,主要用来测试ribbon客户端负载。网络
在pom文件中加入如下依赖:app
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
eureka: client: service-url: defaultZone: http://localhost:8081/eureka/ instance: appname: ribbon-client server: port: 8092 spring: application: name: ribbon-client
/** * @Description :启动类,示范负载均衡服务器 * @Author hanyahong * @Date 2017/12/7- 17:00 */ @SpringBootApplication @EnableDiscoveryClient public class RibbonServiceApplication { public static void main(String[] args) { SpringApplication.run(RibbonServiceApplication.class, args); } /** * Spring提供的用于访问Rest服务的客户端 * @return */ @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
说明:
RestTemplate是Spring提供的用于访问Rest服务的客户端。RestTemplate提供了多种便捷访问远程Http服务的方法,可以大大提升客户端的编写效率。调用RestTemplate的默认构造函数,RestTemplate对象在底层经过使用java.net包下的实现建立HTTP 请求,能够经过使用ClientHttpRequestFactory指定不一样的HTTP请求方式。
ClientHttpRequestFactory接口主要提供了两种实现方式,一种是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)建立底层的Http请求链接,还有一种方式是使用HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient能够配置链接池和证书等信息。
@LoadBalanced 注解加在RestTemplate上面,这个注解会自动构造LoadBalancerClient接口的实现类并注册到Spring容器中。
/** * @Description : 测试客户端负载均衡的接口API * @Author hanyahong * @Date 2017/12/7- 18:01 */ @RestController @RequestMapping(value = "/test") public class TestRibbonApi { /** * 注入RestTemplate */ @Autowired RestTemplate restTemplate; @RequestMapping(value = "/blog/name" ,method = RequestMethod.GET) public String testGetNameOfBlog(){ String url="http://CLOUD-SERVICE/ribbon/name"; return restTemplate.getForObject(url,String.class); } }
注意:这个代码中 url 设置的是 上面提到的服务器的服务名。
通过全面的配置,服务器全面配置完毕,包括一个注册中心、一个配置中心、两个相同配置的服务器、一台测试客户端负载均衡的测试服务器。
启动成功之后会在注册中心看到。
经过访问客户端地址:http://localhost:8092/test/name 就能够访问。效果以下:
刷新一次:
至此全部配置成功。测试结果也成功。
Github源码:https://github.com/hanyahong/spring-cloud-microservice