一:RestTemplate简介
- 简介
RestTemplate是Spring Resources中一个访问第三方RESTful API接口的网络请求框架。
RestTemplate的设计原则和其它Spring Template(例如JdbcTemplate,JmsTemplate)类似,
都是为执行复杂任务提供了一个具有默认行为的简单方法。
RestTemplate是用来消费REST服务的,所以RestTemplate的主要方法都与REST的Http
协议的一些方法紧密相连,例如HEAD,GET,POST,PUT,DELETE和OPTIONS等方法,这些方
法在RestTemplate类对应的方法为headForHeaders(),getForObject(),postForObject(),put(),
和delete()等。
RestTemplate的使用很简单,它支持Xml,JSON数据格式,默认实现了序列化,可以自动
将JSON字符串转换为实体。例如:User user == restTemplate.getForObject(url,User.class).。
二:Ribbon简介
- 简介
Ribbon是Netflix公司开源的一个负载均衡的组件,它是将负载均衡逻辑以代码的形式封装
到服务消费者的客户端上,服务消费者客户端维护了一份服务提供者的信息列表,有了信息列
表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。所以它是一个
服务消费者客户端的负载均衡组件。 - 使用方式
a:和RestTemplate相结合
b:和Feign相结合。Feign已经默认集成了Ribbon。
三:Ribbon负载均衡的实例
- 一个chapter5-2父类,主要是pom.xml文件,用来定义要继承的springboot和springcloud的版本号
pom.xml文件内容如下:
<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.kgf</groupId> <artifactId>chapter5-2</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>chapter5-2</name> <!--继承一个父模块,然后再引入相应的依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <!--relativePath是可选的,maven会首先搜索这个地址,在搜索本地远程repositories之前 --> <relativePath /> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java-version>1.8</java-version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <!--下面的方式通过import可以实现多继承的问题 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <modules> <module>eureka-server</module> <module>eureka-client</module> <module>eureka-ribbon-client</module> </modules> </project>
- 一个eureka-server子服务,这个是eureka的服务端,用来给其他微服务注册列表信息
⑴EurekaServerApplication.java启动类
⑵application.yml配置文件
spring: profiles: active: dev #这里我们默认启用dev环境 --- spring: profiles: dev #环境一 server: port: 8761 eureka: instance: hostname: peer1 #环境一服务名 client: register-with-eureka: false fetch-registry: false --- spring: profiles: test #环境二 server: port: 8762 eureka: instance: hostname: peer2 #环境二服务名 client: service-url: #将peer2注册进入peer1 defaultZone: http://peer1:8761/eureka/
⑶pom.xml文件
<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> <parent> <groupId>com.kgf</groupId> <artifactId>chapter5-2</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-server</name> <dependencies> <!-- 引入eureka-server依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- 引入test测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope><!--表示仅仅在测试的时候编译 --> </dependency> </dependencies> <build> <plugins> <!--能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
- 一个eureka-client子服务,作为微服务的客户端,也就是微服务的提供者
⑴EurekaClientApplication.java启动类
⑵bootstrap.yml配置文件,这个里面存在两个环境,我们到时候需要启动两个消费者服务
⑶HiController.java类
⑷pom.xml文件
<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> <parent> <groupId>com.kgf</groupId> <artifactId>chapter5-2</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>eureka-client</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-client</name> <dependencies> <!-- 引入eureka依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 引入test测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope><!--表示仅仅在测试的时候编译 --> </dependency> </dependencies> <build> <plugins> <!--能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
- 一个eureka-ribbon-client子服务,用来作为一个服务的消费者,负载均衡的请求入口
⑴EurekaRibbonClientApplication.java启动类
⑵RibbonConfig.java注入负载均衡的restTemplate对象
⑶application.yml配置文件
⑷RibbonController.java层
⑸RibbonService.java层,这个类里面通过RestTemplate远程调用工具远程调用eureka-client子服务提供者
中的方法。
⑹pom.xml文件
<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> <parent> <groupId>com.kgf</groupId> <artifactId>chapter5-2</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>eureka-ribbon-client</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-ribbon-client</name> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
- 启动微服务查看效果
⑴首先我们启动一个eureka-server服务,用来做微服务的服务注册的,端口为8761
⑵启动两个eureka-client微服务的提供者应用程序,用来给消费者调用,端口分别为8762,8763
命令如下:
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
⑶启动eureka-ribbon-client微服务的消费者客户端,这个可以对请求做负载均衡,端口为8764
可以发现每一次访问都是轮循访问8762,8763两个端口的微服务
- 总结
通过上面实例我们可以知道,在SpringCloud项目中,负载均衡器Ribbon会默认从Eureka Client的服务
列表中获取服务信息,并且缓存一份。根据缓存的服务注册列表信息,可以通过LoadBalancerClient来选
择不同的服务实例,从而实现负载均衡。如果禁止Ribbon从Eureka获取注册列表信息,则需要自己去维护
一份服务注册列表信息。根据自己维护服务注册列表的信息,Ribbon也可以实现负载均衡。