SpringCloud整合Feign实现负载均衡

比眉伴天荒 2021-12-12 04:07 437阅读 0赞

cloud负载均衡策略主要是rest+ribbon和Feign,但是Feign已经集成了ribbon,所以比较牛逼。就用这个好了

1、首先搭建那么几个项目,一个eureka服务端,用于注册服务,再来三个客户端用于注册服务(一个生产者,两个消费者)。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NjQ4MDI5_size_16_color_FFFFFF_t_70

生产者的接口可以让消费者去消费。。。前提是必须注册到服务上

2、首先看eureka服务端配置

  1. 导入依赖(有的依赖可能不是必须的,我懒得检查,直接全部复制):
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-configuration-processor</artifactId>
  5. <version>2.0.0.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-test</artifactId>
  14. <scope>test</scope>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-web</artifactId>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.springframework.cloud</groupId>
  22. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  23. <version>1.4.4.RELEASE</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-starter-config</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.cloud</groupId>
  31. <artifactId>spring-cloud-starter-eureka</artifactId>
  32. <version>1.4.4.RELEASE</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-security</artifactId>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.springframework.cloud</groupId>
  40. <artifactId>spring-cloud-dependencies</artifactId>
  41. <version>Finchley.BUILD-SNAPSHOT</version>
  42. <type>pom</type>
  43. <scope>import</scope>
  44. </dependency>

application.yml配置信息:

  1. server:
  2. port: 8888
  3. spring:
  4. security:
  5. basic:
  6. enable: true
  7. user:
  8. name: admin
  9. password: 1234
  10. eureka:
  11. instance:
  12. hostname: localhost
  13. client:
  14. registerWithEureka: false
  15. fetchRegistry: false
  16. service-url:
  17. defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/

启动类:

  1. @SpringBootApplication //spring-boot 启动注解
  2. @EnableEurekaServer // spring-cloud 服务注解
  3. public class RegisterMain{
  4. public static void main(String [] args) {
  5. new SpringApplicationBuilder(RegisterMain.class).web(true).run(args);
  6. }
  7. }

写一个配置类

  1. //Spring Cloud 2.0 以上的security默认启用了csrf检验,要在eurekaServer端配置security的csrf检验为false
  2. //覆盖父类的 configure(HttpSecurity http) 方法,关闭掉 csrf。
  3. @EnableWebSecurity
  4. public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
  5. @Override
  6. protected void configure(HttpSecurity http) throws Exception {
  7. http.csrf().disable();
  8. super.configure(http);
  9. }
  10. }

-———————————————————————这样就完成了服务端的配置————————————————————————————

3、创建一个客户端。这里项目创建一个boot工程就行了,然后启动两次

首先是依赖,和上面一样,复制就行了,至于没用的依赖不管了。

启动类:

  1. @SpringBootApplication
  2. @EnableEurekaClient //Eureka Client111
  3. public class AppMain {
  4. public static void main(String[] args) {
  5. new SpringApplicationBuilder(AppMain.class).web(true).run(args);
  6. }
  7. }

application.yml配置信息:

  1. server:
  2. port: 8001
  3. spring:
  4. application:
  5. name: spring-cloud-common
  6. #注册中心指向start
  7. eureka:
  8. # instance:
  9. # instance-id: spring-cloud-common
  10. # appname: ${spring.application.name}
  11. client:
  12. service-url:
  13. defaultZone: http://admin:1234@127.0.0.1:8888/eureka/
  14. #注册中心指向end

在编写一个controller层

  1. @RestController
  2. public class DemoController {
  3. @Value("${server.port}")
  4. String port;
  5. @GetMapping("/demo")
  6. public String demo(@RequestParam(value = "name", defaultValue = "小毅毅") String name) {
  7. return "name:" + name + " ,端口:" + port;
  8. }
  9. }

这里配置文件的端口为8001,我们启动一次后,端口修改成8002在启动一次,那么就会注册上2个服务了。

如何启动2次代码呢?

点击:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NjQ4MDI5_size_16_color_FFFFFF_t_70 1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NjQ4MDI5_size_16_color_FFFFFF_t_70 2

-—————————————————————————这样生产者就写好了—————————————————————

四、现在是最关键的消费者,使用feign实现的负载均衡

关键的maven依赖注意,多添加一个这个

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

然后是启动类:

  1. @SpringBootApplication
  2. //@EnableEurekaClient //Eureka 客户端
  3. @EnableDiscoveryClient
  4. @EnableFeignClients //开启Feign的功能
  5. public class CrudMain {
  6. public static void main(String[] args) {
  7. new SpringApplicationBuilder(CrudMain.class).web(true).run(args);
  8. }
  9. }

application.yml配置文件:

  1. server:
  2. port: 8010
  3. spring:
  4. application:
  5. name: spring-cloud-crud
  6. #注册中心指向start
  7. eureka:
  8. instance:
  9. instance-id: spring-cloud-crud
  10. appname: ${spring.application.name}
  11. client:
  12. service-url:
  13. defaultZone: http://admin:1234@127.0.0.1:8888/eureka/
  14. #注册中心指向end

关键地方,接口的编写,我这里为了省事,就一个类里面把所有代码都写上

  1. @RestController
  2. public class TestController {
  3. // @Autowired
  4. // private RestTemplate restTemplate;
  5. @Autowired
  6. Feign feign; //依赖注入的接口
  7. // private static final String MALL_CRUD_USERS_URL = "http://spring-cloud-common/";
  8. @GetMapping("/getCommon")
  9. public String getCommon(@RequestParam String name) {
  10. System.out.println("调用服务开始---------");
  11. // String s = restTemplate.getForObject(MALL_CRUD_USERS_URL+"demo?name="+name, String.class);
  12. String s=feign.feignDemo(name);
  13. System.out.println("调用服务结束---------调用取得的值为:"+s);
  14. return s;
  15. }
  16. }
  17. /*
  18. * 这个接口就是为了调用别的服务
  19. * */
  20. @Service
  21. @FeignClient(value = "spring-cloud-common") //Feign会根据注解上的value值找到具体的服务名,然后再根据接口上的Mapping找到当前服务对应的接口
  22. interface Feign{
  23. @GetMapping("/demo") //这里的路径和生产者的路径一致,所以才能对应上
  24. String feignDemo(@RequestParam(value = "name") String name);
  25. }

-————————————————————-消费者完成————————————————————————————

接下来系统测试:

按照顺序启动,首先是eureka服务端,由于开启了安全认证,所以登录后就能访问了,账号amdin,密码1234。配置文件都写了的。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NjQ4MDI5_size_16_color_FFFFFF_t_70 3

登录成功后,还没有服务注册:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NjQ4MDI5_size_16_color_FFFFFF_t_70 4

然后服务端的启动顺序就不规定了,我这里先启动common这个包的,这个生产者得启动两次,启动第一次后修改端口启动第二次。两次都启动成功后如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NjQ4MDI5_size_16_color_FFFFFF_t_70 5

注册成功,这时候启动消费者crud包

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NjQ4MDI5_size_16_color_FFFFFF_t_70 6

成功启动成所有项目。。这个时候进行测试:

浏览器输入:http://localhost:8010/getCommon?name=小毅毅

20190710110312159.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NjQ4MDI5_size_16_color_FFFFFF_t_70 7

2019071011032331.png

成功实现负载均衡———————

发表评论

表情:
评论列表 (有 0 条评论,437人围观)

还没有评论,来说两句吧...

相关阅读