【SpringCloud】整合Consul+OpenFeign实现微服务+负载均衡(上)

心已赠人 2024-03-26 16:09 152阅读 0赞

一、服务架构

afe201fddbf2623b526774063ea45e7e.png

service-common 核心公共功能服务

service-provider 服务提供者微服务

service-consumer 服务消费者微服务

主要特性:

  1. springcloud+consul+openfeign+ribbion

  2. 基于feign_client + rest_template 两种微服务调用方式

二、父pom.xml文件

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>springcloud-consul</artifactId>
  8. <packaging>pom</packaging>
  9. <version>1.0-SNAPSHOT</version>
  10. <modules>
  11. <module>service-common</module>
  12. <module>service-provider</module>
  13. <module>service-consumer</module>
  14. </modules>
  15. <parent>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-parent</artifactId>
  18. <version>2.1.4.RELEASE</version>
  19. <relativePath/> <!-- lookup parent from repository -->
  20. </parent>
  21. <dependencyManagement>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.cloud</groupId>
  25. <artifactId>spring-cloud-dependencies</artifactId>
  26. <version>Greenwich.RELEASE</version>
  27. <type>pom</type>
  28. <scope>import</scope>
  29. </dependency>
  30. </dependencies>
  31. </dependencyManagement>
  32. <properties>
  33. <maven.compiler.source>8</maven.compiler.source>
  34. <maven.compiler.target>8</maven.compiler.target>
  35. </properties>
  36. <dependencies>
  37. <dependency>
  38. <groupId>org.springframework.cloud</groupId>
  39. <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  40. </dependency>
  41. <!-- SpringBoot监控 -->
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter-actuator</artifactId>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-web</artifactId>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework.cloud</groupId>
  52. <artifactId>spring-cloud-starter-consul-config</artifactId>
  53. </dependency>
  54. <dependency>
  55. <groupId>org.springframework.cloud</groupId>
  56. <artifactId>spring-cloud-starter-openfeign</artifactId>
  57. </dependency>
  58. <dependency>
  59. <groupId>org.projectlombok</groupId>
  60. <artifactId>lombok</artifactId>
  61. <version>1.18.0</version>
  62. <scope>provided</scope>
  63. </dependency>
  64. </dependencies>
  65. </project>

三、公共服务service-common代码

7aa2ac3043256731e16655f40cf29919.png

pom.xml文件

springcloud-consul/service-common/pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>springcloud-consul</artifactId>
  7. <groupId>org.example</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>service-common</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. </project>

springcloud-consul/service-common/src/main/java/com/example/common/model/UserModel.java

  1. package com.example.common.model;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.io.Serializable;
  6. @Data
  7. @NoArgsConstructor
  8. @AllArgsConstructor
  9. public class UserModel implements Serializable {
  10. private String username;
  11. private int age;
  12. private String address;
  13. private String job;
  14. }

springcloud-consul/service-common/src/main/java/com/example/common/service/UserService.java

  1. package com.example.common.service;
  2. import com.example.common.model.UserModel;
  3. import java.util.List;
  4. public interface UserService {
  5. List<UserModel> findAll();
  6. UserModel findById(int id);
  7. String port();
  8. }

四、服务提供者service-provider代码

pom.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>springcloud-consul</artifactId>
  7. <groupId>org.example</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. <relativePath>../pom.xml</relativePath>
  10. </parent>
  11. <modelVersion>4.0.0</modelVersion>
  12. <artifactId>service-provider</artifactId>
  13. <properties>
  14. <maven.compiler.source>8</maven.compiler.source>
  15. <maven.compiler.target>8</maven.compiler.target>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.example</groupId>
  20. <artifactId>service-common</artifactId>
  21. <version>1.0-SNAPSHOT</version>
  22. </dependency>
  23. </dependencies>
  24. <build>
  25. <plugins>
  26. <plugin>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-maven-plugin</artifactId>
  29. <executions>
  30. <execution>
  31. <phase>package</phase>
  32. <goals>
  33. <goal>repackage</goal>
  34. </goals>
  35. </execution>
  36. </executions>
  37. <configuration>
  38. <includeSystemScope>true</includeSystemScope>
  39. <mainClass>com.example.provider.ConsulProviderApplication</mainClass>
  40. </configuration>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

springcloud-consul/service-provider/src/main/resources/application.yml

  1. spring:
  2. application:
  3. name: service-provider
  4. profiles:
  5. active: dev
  6. cloud:
  7. consul:
  8. # 服务发现配置
  9. discovery:
  10. # 启用服务发现
  11. enabled: true
  12. # 启用服务注册
  13. register: true
  14. # 服务停止时取消注册
  15. deregister: true
  16. # 表示注册时使用IP而不是hostname
  17. prefer-ip-address: true
  18. # 执行监控检查的频率
  19. health-check-interval: 30s
  20. # 设置健康检查失败多长时间后,取消注册
  21. health-check-critical-timeout: 30s
  22. # 健康检查的路径
  23. health-check-path: /actuator/info
  24. # 服务注册标识,格式为:应用名称+服务器IP+端口
  25. instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
  26. server:
  27. port: 8011

springcloud-consul/service-provider/src/main/resources/bootstrap.yml

  1. # bootstrap.yml
  2. # consul 使用动态配置,必须在bootstrap.yml中配置好动态配置项目的配置
  3. spring:
  4. cloud:
  5. consul:
  6. host: localhost
  7. port: 8500
  8. #enabled将此值设置为“false”禁用Consul配置
  9. config:
  10. enabled: true #默认是true --
  11. format: YAML # 表示consul上面文件的格式 有四种 YAML PROPERTIES KEY-VALUE FILES
  12. data-key: data #表示consul上面的KEY值(或者说文件的名字) 默认是data
  13. # watch选项为配置监视功能,主要监视配置的改变
  14. watch:
  15. enabled: true
  16. delay: 10000
  17. wait-time: 30

springcloud-consul/service-provider/src/main/java/com/example/provider/service/impl/UserServiceImpl.java

  1. package com.example.provider.service.impl;
  2. import com.example.common.model.UserModel;
  3. import com.example.common.service.UserService;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.stereotype.Service;
  6. import java.util.Arrays;
  7. import java.util.List;
  8. @Service
  9. public class UserServiceImpl implements UserService {
  10. @Value("${server.port}")
  11. int port;
  12. @Override
  13. public List<UserModel> findAll() {
  14. return Arrays.asList(
  15. new UserModel("张三", 22, "西安", "Java开发"),
  16. new UserModel("李四", 24, "深圳", "总经理助理"),
  17. new UserModel("王五", 56, "上海", "HR"),
  18. new UserModel("赵六", 12, "广州", "PHP开发"),
  19. new UserModel("宋七", 42, "重庆", "运营")
  20. );
  21. }
  22. @Override
  23. public UserModel findById(int id) {
  24. return new UserModel("lucy", 44, "西雅图", "董事长");
  25. }
  26. @Override
  27. public String port() {
  28. return "Port: " + port;
  29. }
  30. }

springcloud-consul/service-provider/src/main/java/com/example/provider/web/HiController.java

  1. package com.example.provider.web;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RequestParam;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class HiController {
  8. @Value("${server.port}")
  9. String port;
  10. @GetMapping("/hi")
  11. public String home(@RequestParam String name) {
  12. return "hi "+name+",i am from port:" +port;
  13. }
  14. @GetMapping("/port")
  15. public String port() {
  16. return port;
  17. }
  18. }

springcloud-consul/service-provider/src/main/java/com/example/provider/web/UserController.java

  1. package com.example.provider.web;
  2. import com.example.common.model.UserModel;
  3. import com.example.common.service.UserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import java.util.List;
  9. @RestController
  10. @RequestMapping("api/user")
  11. public class UserController {
  12. @Autowired
  13. UserService userService;
  14. @GetMapping("list")
  15. public List<UserModel> findAll() {
  16. return userService.findAll();
  17. }
  18. @GetMapping("get")
  19. public UserModel findById(int id) {
  20. return userService.findById(id);
  21. }
  22. @GetMapping("port")
  23. public String port() {
  24. return userService.port();
  25. }
  26. }

springcloud-consul/service-provider/src/main/java/com/example/provider/ConsulProviderApplication.java

  1. package com.example.provider;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import org.springframework.context.annotation.ComponentScan;
  6. @SpringBootApplication
  7. @ComponentScan(basePackages = {"com.example"})
  8. @EnableDiscoveryClient
  9. public class ConsulProviderApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(ConsulProviderApplication.class, args);
  12. System.out.println(".....................................");
  13. System.out.println("....Provider Application started.....");
  14. System.out.println(".....................................");
  15. }
  16. }

五、服务消费者service-consumer代码

7ed3f879d6f796621631f418acfce4a5.png

pom.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>springcloud-consul</artifactId>
  7. <groupId>org.example</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. <relativePath>../pom.xml</relativePath>
  10. </parent>
  11. <modelVersion>4.0.0</modelVersion>
  12. <artifactId>service-consumer</artifactId>
  13. <properties>
  14. <maven.compiler.source>8</maven.compiler.source>
  15. <maven.compiler.target>8</maven.compiler.target>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.example</groupId>
  20. <artifactId>service-common</artifactId>
  21. <version>1.0-SNAPSHOT</version>
  22. </dependency>
  23. </dependencies>
  24. <build>
  25. <plugins>
  26. <plugin>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-maven-plugin</artifactId>
  29. <executions>
  30. <execution>
  31. <phase>package</phase>
  32. <goals>
  33. <goal>repackage</goal>
  34. </goals>
  35. </execution>
  36. </executions>
  37. <configuration>
  38. <includeSystemScope>true</includeSystemScope>
  39. <mainClass>com.example.consumer.ConsulConsumerApplication</mainClass>
  40. </configuration>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

springcloud-consul/service-consumer/src/main/java/com/example/consumer/feign/HiFeign.java

  1. package com.example.consumer.feign;
  2. import org.springframework.cloud.openfeign.FeignClient;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RequestParam;
  5. @FeignClient(value = "service-provider", contextId = "hi")
  6. public interface HiFeign {
  7. @GetMapping(value = "/hi")
  8. String sayHiFromFeign(@RequestParam(value = "name") String name);
  9. }

springcloud-consul/service-consumer/src/main/java/com/example/consumer/feign/UserFeign.java

  1. package com.example.consumer.feign;
  2. import com.example.common.model.UserModel;
  3. import org.springframework.cloud.openfeign.FeignClient;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7. import java.util.List;
  8. @FeignClient(value = "service-provider", contextId = "user")
  9. @RequestMapping("api/user")
  10. public interface UserFeign {
  11. @GetMapping(value = "list")
  12. List<UserModel> findAll();
  13. @GetMapping(value = "get")
  14. UserModel findById(@RequestParam(value = "id") int id);
  15. @GetMapping(value = "port")
  16. String getPort();
  17. }

springcloud-consul/service-consumer/src/main/java/com/example/consumer/service/HiService.java

  1. package com.example.consumer.service;
  2. import com.example.consumer.feign.HiFeign;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. @Service
  6. public class HiService {
  7. @Autowired
  8. HiFeign hiFeign;
  9. public String sayHi(String name) {
  10. return hiFeign.sayHiFromFeign(name);
  11. }
  12. }

springcloud-consul/service-consumer/src/main/java/com/example/consumer/service/impl/UserFeignServiceImpl.java

  1. package com.example.consumer.service.impl;
  2. import com.example.common.model.UserModel;
  3. import com.example.common.service.UserService;
  4. import com.example.consumer.feign.UserFeign;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import java.util.List;
  8. @Service
  9. public class UserFeignServiceImpl implements UserService {
  10. @Autowired
  11. UserFeign userFeign;
  12. @Override
  13. public List<UserModel> findAll() {
  14. return userFeign.findAll();
  15. }
  16. @Override
  17. public UserModel findById(int id) {
  18. return userFeign.findById(id);
  19. }
  20. @Override
  21. public String port() {
  22. return userFeign.getPort();
  23. }
  24. }

springcloud-consul/service-consumer/src/main/java/com/example/consumer/service/impl/UserRestServiceImpl.java

  1. package com.example.consumer.service.impl;
  2. import com.example.common.model.UserModel;
  3. import com.example.common.service.UserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.core.ParameterizedTypeReference;
  6. import org.springframework.http.HttpMethod;
  7. import org.springframework.http.ResponseEntity;
  8. import org.springframework.stereotype.Service;
  9. import org.springframework.web.client.RestTemplate;
  10. import java.util.List;
  11. @Service
  12. public class UserRestServiceImpl implements UserService {
  13. @Autowired
  14. RestTemplate restTemplate;
  15. @Override
  16. public List<UserModel> findAll() {
  17. ResponseEntity<List<UserModel>> responseEntity = restTemplate.exchange(
  18. "http://service-provider/api/user/list",
  19. HttpMethod.GET,
  20. null,
  21. new ParameterizedTypeReference<List<UserModel>>() {
  22. });
  23. return responseEntity.getBody();
  24. }
  25. @Override
  26. public UserModel findById(int id) {
  27. ResponseEntity<UserModel> responseEntity = restTemplate.exchange(
  28. "http://service-provider/api/user/get?id=" + id,
  29. HttpMethod.GET,
  30. null,
  31. new ParameterizedTypeReference<UserModel>() {
  32. });
  33. return responseEntity.getBody();
  34. }
  35. @Override
  36. public String port() {
  37. ResponseEntity<String> responseEntity = restTemplate.exchange(
  38. "http://service-provider/api/user/port",
  39. HttpMethod.GET,
  40. null,
  41. new ParameterizedTypeReference<String>() {
  42. });
  43. return responseEntity.getBody();
  44. }
  45. }

springcloud-consul/service-consumer/src/main/java/com/example/consumer/web/HiController.java

  1. package com.example.consumer.web;
  2. import com.example.consumer.service.HiService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7. import org.springframework.web.bind.annotation.RestController;
  8. @RestController
  9. public class HiController {
  10. @Autowired
  11. HiService hiService;
  12. @Value("${server.port}")
  13. String port;
  14. @GetMapping("/hi")
  15. public String home(@RequestParam String name) {
  16. return hiService.sayHi(name);
  17. }
  18. @GetMapping("/port")
  19. public String port() {
  20. return port;
  21. }
  22. }

springcloud-consul/service-consumer/src/main/java/com/example/consumer/web/UserFeignController.java

  1. package com.example.consumer.web;
  2. import com.example.common.model.UserModel;
  3. import com.example.common.service.UserService;
  4. import com.example.consumer.service.impl.UserFeignServiceImpl;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import java.util.List;
  10. @RestController
  11. @RequestMapping("feign-api/user")
  12. public class UserFeignController implements UserService {
  13. @Autowired
  14. UserFeignServiceImpl userService;
  15. @Override
  16. @GetMapping("/list")
  17. public List<UserModel> findAll() {
  18. return userService.findAll();
  19. }
  20. @Override
  21. @GetMapping("/get")
  22. public UserModel findById(int id) {
  23. return userService.findById(id);
  24. }
  25. @Override
  26. @GetMapping("port")
  27. public String port() {
  28. return userService.port();
  29. }
  30. }

springcloud-consul/service-consumer/src/main/java/com/example/consumer/web/UserRestController.java

  1. package com.example.consumer.web;
  2. import com.example.common.model.UserModel;
  3. import com.example.common.service.UserService;
  4. import com.example.consumer.service.impl.UserRestServiceImpl;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import java.util.List;
  10. @RestController
  11. @RequestMapping("rest-api/user")
  12. public class UserRestController implements UserService {
  13. @Autowired
  14. UserRestServiceImpl userRestService;
  15. @GetMapping("list")
  16. public List<UserModel> findAll() {
  17. return userRestService.findAll();
  18. }
  19. @GetMapping("get")
  20. public UserModel findById(int id) {
  21. return userRestService.findById(id);
  22. }
  23. @GetMapping("port")
  24. public String port() {
  25. return userRestService.port();
  26. }
  27. }

springcloud-consul/service-consumer/src/main/java/com/example/consumer/ConsulConsumerApplication.java

  1. package com.example.consumer;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  6. import org.springframework.cloud.openfeign.EnableFeignClients;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.ComponentScan;
  9. import org.springframework.web.client.RestTemplate;
  10. @SpringBootApplication
  11. @ComponentScan(basePackages = {"com.example"})
  12. @EnableDiscoveryClient
  13. @EnableFeignClients
  14. public class ConsulConsumerApplication {
  15. public static void main(String[] args) {
  16. SpringApplication.run(ConsulConsumerApplication.class, args);
  17. System.out.println(".....................................");
  18. System.out.println("....Consumer Application started.....");
  19. System.out.println(".....................................");
  20. }
  21. @Bean
  22. @LoadBalanced
  23. public RestTemplate restTemplate() {
  24. return new RestTemplate();
  25. }
  26. }

springcloud-consul/service-consumer/src/main/resources/application.yml

  1. spring:
  2. application:
  3. name: service-consumer
  4. profiles:
  5. active: dev
  6. cloud:
  7. consul:
  8. # 服务发现配置
  9. discovery:
  10. # 启用服务发现
  11. enabled: true
  12. # 启用服务注册
  13. register: true
  14. # 服务停止时取消注册
  15. deregister: true
  16. # 表示注册时使用IP而不是hostname
  17. prefer-ip-address: true
  18. # 执行监控检查的频率
  19. health-check-interval: 30s
  20. # 设置健康检查失败多长时间后,取消注册
  21. health-check-critical-timeout: 30s
  22. # 健康检查的路径
  23. health-check-path: /actuator/info
  24. # 服务注册标识,格式为:应用名称+服务器IP+端口
  25. instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
  26. server:
  27. port: 8001

springcloud-consul/service-consumer/src/main/resources/bootstrap.yml

  1. # bootstrap.yml
  2. # consul 使用动态配置,必须在bootstrap.yml中配置好动态配置项目的配置
  3. spring:
  4. cloud:
  5. consul:
  6. host: localhost
  7. port: 8500
  8. #enabled将此值设置为“false”禁用Consul配置
  9. config:
  10. enabled: true #默认是true --
  11. format: YAML # 表示consul上面文件的格式 有四种 YAML PROPERTIES KEY-VALUE FILES
  12. data-key: data #表示consul上面的KEY值(或者说文件的名字) 默认是data
  13. # watch选项为配置监视功能,主要监视配置的改变
  14. watch:
  15. enabled: true
  16. delay: 10000
  17. wait-time: 30

六、测试

由于篇幅有限,测试效果见下一篇文章。

https://blog.csdn.net/forest_long/article/details/129288367

发表评论

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

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

相关阅读