1、在上一篇博客创建的客户端项目中添加测试接口,用于测试负载均衡。如下,
package com.zw.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController // 配置为controller
public class TestController {
@Value("${server.port}") // 读取配置文件的端口
String port;
/**
* 设置一个方法
* 参数什么的 可以用HttpServletRequest 也可以用 @RequestParam
* 测试我就不添加了
* @return
*/
@RequestMapping(value="/test")
public String testMethod() {
return "你好这里是 端口:" + port+" 的服务";
}
}
2、对于以上的项目原封不动的复制一份出来,仅在application.yml中改变输出的端口,复制前的端口为7002,复制后,将后者改成7003。修改后现在的项目目录如下:(注意:client1和client2除了application.yml中的端口不同外,其他一摸一样,用于后续测试负载均衡)
3、在父项目上,新建maven module模块(spring-cloud-ribbon),其pom依赖如下:
4.0.0
com.zw
spring-cloud
0.0.1-SNAPSHOT
spring-cloud-client1
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka-server
4、添加配置文件如下,端口7004
server:
port: 7004
spring:
application:
name: spring-cloud-ribbon
security:
basic:
enable: true
user:
name: admin
password: 123456
#注册中心指向start
eureka:
client:
service-url:
defaultZone: http://${security.user.name}:${security.user.password}@127.0.0.1:7001/eureka/
#注册中心指向end
5、添加启动类,如下:
@Bean 将返回的RestTemplate对象添加到spring容器中。
@LoadBalanced 使容器中的RestTemplate对象具有负载均衡的能力。
package com.zw;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient //ribbon Client
public class RibbonMain {
public static void main(String[] args) {
new SpringApplicationBuilder(RibbonMain.class).web(true).run(args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
6、编写测试类如下:(调用client项目的test接口,这里注意spring-cloud-client1是配置文件中的spring.application.name,不是我们在eclipse中看到的模块名称,实际上client1和client2的配置spring.application.name是一样的,都是spring-cloud-client1)。
package com.zw.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController // 配置为controller
public class TestController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value="/demo")
public String testMethod() {
return restTemplate.getForObject("http://spring-cloud-client1/test", String.class);
}
}
7、测试负载均衡
(1)、在我们的eureka中,我们可以看到如下,spring-cloud-client1具有两个节点,ribbon有一个服务节点。
(2)、我们在新的浏览器输入如下接口调用地址,反复调用:
http://localhost:7004/demo
可以看到两种情况,说明ribbon项目具有负载均衡的能力。
8、这里我们总结一下:
实际上我们的项目模块中包括spring-cloud-eureka,spring-cloud-client1,spring-cloud-client2,spring-cloud-ribbon四个模块。
(1)、我们最先需要启动注册中心,这是cloud项目的最基层起点。
(2)、其次启动服务spring-cloud-client1,spring-cloud-client2两个模块,需要先有提供者提供服务,这两个模块在启动时候会注册到eureka中。
(3)、启动负载均衡的spring-cloud-ribbon,启动后首先也是会把他注册到eureka中,此时,我们调用服务将可以通过ribbon去调用到client服务,这样会实现负载均衡;当然也可以直接去调用对应端口的服务,但就不能均衡了。
(4)、所有其他模块都需要最先注册到eureka上,之后调用可以进行ribbon的负载均衡调用。
学海无涯苦作舟,继续前行!