不惑之年的硬件牛人转到软件自学之spring cloud:(六)一个简单的负载均衡ribbon实例
前言:笔者曾经有18年的硬件研发经验,从(1)51单片机到(2)FPGA到(3)嵌入式ARM(ARM9到CORTEX A9)全都研发设计过,产品从(1)B超的整机研发到(2)智能家居系统到(3)无线电监测机到(4)平板电脑研发到(5)路灯智能控制到(5)工业电脑均有涉及,从(1)普通的电子技术工程师到(2)副总工程师到(3)副总经理到(4)事业部总经理。。。目前已经步入不惑之年的我对于物联网技术的热衷,决定从硬件开始全面转到物联技术框架之一的spring cloud技术,把我的整个学习经历和大家一起分享,也期待在之后有更多机会和大家一起合作,探讨。
今天是:2018年4月16日 研究主题:一个简单的负载均衡ribbon实例
一、负载均衡结构图,注:为了和以前项目名字尽量一致,我们将以下名字分别改为:
1、“Cjb-eureka”改为:“cjb-ribbon-eureka”;
2、“Cjb-provider”改为:“cjb-ribbon-server”;
3、“Cjb-invoker”改为:“cjb-ribbon-client”;
二 、按照以上架构图,我们先进行cjb-ribbon-eureka注册中心的设计,复制之前的eureka工程,更改端口为8888,也就是更改application.properties如下:
运行DemoApplication.java,并在网页中输入:http://localhost:8888/运行启动eureka注册中心,如下:
三、更改服务提供者,还是以之前cjb-server为修改项目cjb-ribbon-server:
1、修改pom.xml,增加euerka的依赖:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.demo</groupId> <artifactId>cjb-server</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> </project>
2、将配置文件“application.properties"改为“application.yml”,使配置更加简洁,内容如下:
spring: application: name: cjb-server eureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://localhost:8888/eureka/
3、将“CjbApplication.java”更改为端口监测,由于我们需要输入端口才能让程序运行,所以必须做如下更改:
package com.example.demo; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import java.util.Scanner; @SpringBootApplication @EnableEurekaClient public class CjbApplication { public static void main(String[] args) { // 读取控制台输入作为端口参数 Scanner scan = new Scanner(System.in); String port = scan.nextLine(); // 设置启动的服务器端口 new SpringApplicationBuilder(CjbApplication.class).properties( "server.port=" + port).run(args); } }
运行这个应用“CjbApplication”,并输入端口号:
4、由于还需要增加一个端口,所以我们复制一个class:“Cjb1Application.class”
package com.example.demo; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import java.util.Scanner; @SpringBootApplication @EnableEurekaClient public class Cjb1Application { public static void main(String[] args) { // 读取控制台输入作为端口参数 Scanner scan = new Scanner(System.in); String port = scan.nextLine(); // 设置启动的服务器端口 new SpringApplicationBuilder(Cjb1Application.class).properties( "server.port=" + port).run(args); } }
运行这个应用“CjbApplication”,并输入端口号8081:
5、在注册中心eureka中查看,新增两个端口的服务cjb-ribbon-server:
四、修改cjb-ribbon-client的配置内容:
1、修改依赖文件pom.xml增加ribbon:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.demo</groupId> <artifactId>cjb-ribbon-client</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> </dependencies> </project>
2、修改配置文件application.yml为:
server: port: 8100 spring: application: name: cjb-ribbon-client cloud: loadbalancer: retry: false eureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://localhost:8888/eureka/
3、建立主文件main,与之前建立的一样,没有多大区别:
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class CjbClient { public static void main(String[] args) { SpringApplication.run(CjbClient.class, args); } }
4、建立访问路径文件Cjbcontroller.class,如下:
package com.example.demo; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @Configuration public class Cjbcontroller { @LoadBalanced @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } @RequestMapping(value = "/router", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public String router() { RestTemplate restTpl = getRestTemplate(); // 根据名称调用服务 String json = restTpl.getForObject("http://cjb-ribbon-server/person/1", String.class); return json; } }
以上的意思是:为RestTemplate加入了@LoadBalanced修饰,增加负载均衡的调用,并用@Bean写入spring的容器,采用路径:“/router”用GET的方式调用注册的两个“cjb-ribbon-server”的服务,从而获取json数据,首先我们看一**册中心里面cjb-ribbon-client有没有注册成功:
OK,已经注册成功了。
其次,我们通过http://localhost:8100/router来访问cjb-ribbon-server/person/1里面的数据,下面就是我们见证奇迹的时候了,如下图:
点第一下,访问的是:http://localhost:8080/person/1
点第二下(即按刷新),访问的是:http://localhost:8081/person/1
按照此顺序依次点击,会分别依顺序访问8080和8081端口的服务,这个就实现了负载均衡的目的。OK,大工告成!
五、如果需要完整代码的朋友,可以加入作者QQ群:智物联的spring cloud,入群说明:spring cloud代码需求