开启你的第一行Spring Cloud代码

逃离我推掉我的手 2023-07-23 03:46 4阅读 0赞

本篇威哥打算分享如何搭建Spring Cloud框架。

好了,跟随威哥一起开启你的第一行Spring Cloud代码吧。

1、首先打开你的IDEA。创建一个Maven项目:william-spring-project。

按照威哥下面截图来操作。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 3

注意,上面Maven的配置请换成自己的Maven配置,下面是威哥的Maven配置。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 4

OK,Maven项目搭建成功,如图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 5

2、创建服务注册中心

项目名称:register-server。威哥直接上图操作说明。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 6

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 7

如果上面点击下一步没有反应,这个可以使用国内阿里代理来操作,国内代理地址:https://start.aliyun.com。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 8

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 9

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 10

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 11

项目创建成功,这个之后需要来检查pom配置。pom.xml配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.william</groupId>
  6. <artifactId>spring</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>register-server</name>
  9. <description>Demo project for Spring Boot</description>
  10. <properties>
  11. <java.version>1.8</java.version>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14. <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
  15. <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-test</artifactId>
  25. <scope>test</scope>
  26. <exclusions>
  27. <exclusion>
  28. <groupId>org.junit.vintage</groupId>
  29. <artifactId>junit-vintage-engine</artifactId>
  30. </exclusion>
  31. </exclusions>
  32. </dependency>
  33. </dependencies>
  34. <dependencyManagement>
  35. <dependencies>
  36. <dependency>
  37. <groupId>org.springframework.cloud</groupId>
  38. <artifactId>spring-cloud-dependencies</artifactId>
  39. <version>${spring-cloud.version}</version>
  40. <type>pom</type>
  41. <scope>import</scope>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-dependencies</artifactId>
  46. <version>${spring-boot.version}</version>
  47. <type>pom</type>
  48. <scope>import</scope>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework.cloud</groupId>
  52. <artifactId>spring-cloud-starter-eureka</artifactId>
  53. <version>1.4.7.RELEASE</version>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.springframework.cloud</groupId>
  57. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  58. </dependency>
  59. <dependency>
  60. <groupId>org.springframework.boot</groupId>
  61. <artifactId>spring-boot-starter-web</artifactId>
  62. </dependency>
  63. <dependency>
  64. <groupId>org.springframework.boot</groupId>
  65. <artifactId>spring-boot-starter-test</artifactId>
  66. <scope>test</scope>
  67. <exclusions>
  68. <exclusion>
  69. <groupId>org.junit.vintage</groupId>
  70. <artifactId>junit-vintage-engine</artifactId>
  71. </exclusion>
  72. </exclusions>
  73. </dependency>
  74. </dependencies>
  75. </dependencyManagement>
  76. <build>
  77. <plugins>
  78. <plugin>
  79. <groupId>org.apache.maven.plugins</groupId>
  80. <artifactId>maven-compiler-plugin</artifactId>
  81. <configuration>
  82. <source>1.8</source>
  83. <target>1.8</target>
  84. <encoding>UTF-8</encoding>
  85. </configuration>
  86. </plugin>
  87. <plugin>
  88. <groupId>org.springframework.boot</groupId>
  89. <artifactId>spring-boot-maven-plugin</artifactId>
  90. <version>2.2.6.RELEASE</version>
  91. </plugin>
  92. </plugins>
  93. </build>
  94. </project>

配置application或者yml。这里威哥说明下,yml配置文件以树形结构组成,其优先级高于application,会在application之前先假装yml,如果同时存application和yml,那么application将会因为后加载而覆盖yml配置。下面威哥把2种配置都提供出来。

application.properties配置如下:

  1. server.port=9010
  2. eureka.instance.hostname=127.0.0.1
  3. #禁止自己当做服务注册
  4. eureka.client.register-with-eureka=false
  5. #屏蔽注册信息
  6. eureka.client.fetch-registry=false
  7. eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

application.yml配置如下:

  1. server:
  2. port: 9010
  3. eureka:
  4. instance:
  5. hostname: localhost
  6. client:
  7. register-with-eureka: false
  8. fetch-registry: false
  9. service-url:
  10. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

RegisterServerApplication启动项代码:

  1. @SpringBootApplication
  2. @EnableEurekaServer
  3. public class RegisterServerApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(RegisterServerApplication.class, args);
  6. }
  7. }

上面@EnableEurekaServer的意思是:申明此处为服务注册中心。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 12

调试运行起来,之后在浏览器输入:http://localhost:9010/

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 13

出现上面效果图,证明Eureka注册中心发布成功。

3、创建服务生产者

项目名称:service-producer,创建步骤同时,只是勾选Eureka选项时区别下,如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 14

检查pom.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.2.6.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.william</groupId>
  12. <artifactId>spring</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>service-producer</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. <exclusions>
  34. <exclusion>
  35. <groupId>org.junit.vintage</groupId>
  36. <artifactId>junit-vintage-engine</artifactId>
  37. </exclusion>
  38. </exclusions>
  39. </dependency>
  40. </dependencies>
  41. <dependencyManagement>
  42. <dependencies>
  43. <dependency>
  44. <groupId>org.springframework.cloud</groupId>
  45. <artifactId>spring-cloud-dependencies</artifactId>
  46. <version>${spring-cloud.version}</version>
  47. <type>pom</type>
  48. <scope>import</scope>
  49. </dependency>
  50. </dependencies>
  51. </dependencyManagement>
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <groupId>org.springframework.boot</groupId>
  56. <artifactId>spring-boot-maven-plugin</artifactId>
  57. </plugin>
  58. </plugins>
  59. </build>
  60. </project>

配置application.properties:

  1. eureka.client.service-url.defaultZone=http://localhost:9010/eureka/
  2. server.port=9011
  3. spring.application.name=service-producer
  4. test=Hellow,I am WeiGe,Welocme to Java World
  5. server.tomcat.uri-encoding=utf-8
  6. spring.http.encoding.charset=utf-8
  7. spring.http.encoding.enabled=true
  8. spring.http.encoding.force=true
  9. spring.cloud.loadbalancer.ribbon.enabled=false

启动项ServiceConsumerApplication:

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @RestController
  4. public class ServiceProducerApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ServiceProducerApplication.class, args);
  7. }
  8. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 15

新建TestController:

  1. package com.william.producer;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestParam;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. @RequestMapping("service-producer-test")
  8. public class TestController {
  9. @Value("${test}")
  10. String test;
  11. @Value("${spring.application.name}")
  12. String appionName;
  13. @Value("${server.port}")
  14. String port;
  15. @RequestMapping(value = "/mytest")
  16. public String mytest(@RequestParam String name) {
  17. return String.format("Hello %s,%s,该信息从服务:%s,端口:%s吐出。", name, test, appionName, port);
  18. }
  19. }

ok,启动service-server和service-producer,可以看到生产者已经注册到了Eureka服务注册中心。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 16

现在跟随威哥来测试一把服务是不是通的,打开浏览器或者postMan输入:

http://localhost:9011/service-producer-test/mytest?name=威哥

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 17

OK,上面测试证明服务OK。接下来威哥要新建Facade层,用来做Request和Response层使用,因为上面做的服务都是最简单的url传参,但是实际使用中我们都是使用json对象来传参的。

4、创建Facade项目:service-facade

具体步骤都可以同时,也可以创建j2ee的项目,都行,威哥是这样创建的:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 18

注意:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 19

之后新建request和response:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 20

威哥贴一下pom.xml内容,可能有些同学需要,注意,需要安装下lombok插件。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.2.6.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.william</groupId>
  12. <artifactId>facade</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>service-facade</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-function-context</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. <exclusions>
  34. <exclusion>
  35. <groupId>org.junit.vintage</groupId>
  36. <artifactId>junit-vintage-engine</artifactId>
  37. </exclusion>
  38. </exclusions>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.projectlombok</groupId>
  42. <artifactId>lombok</artifactId>
  43. <version>1.18.12</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>javax.validation</groupId>
  47. <artifactId>validation-api</artifactId>
  48. <version>2.0.1.Final</version>
  49. </dependency>
  50. </dependencies>
  51. <dependencyManagement>
  52. <dependencies>
  53. <dependency>
  54. <groupId>org.springframework.cloud</groupId>
  55. <artifactId>spring-cloud-dependencies</artifactId>
  56. <version>${spring-cloud.version}</version>
  57. <type>pom</type>
  58. <scope>import</scope>
  59. </dependency>
  60. </dependencies>
  61. </dependencyManagement>
  62. <build>
  63. <plugins>
  64. <plugin>
  65. <groupId>org.springframework.boot</groupId>
  66. <artifactId>spring-boot-maven-plugin</artifactId>
  67. </plugin>
  68. </plugins>
  69. </build>
  70. </project>

GetCustomerRequest代码:

  1. package com.william.facade.request;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import lombok.Data;
  4. import javax.validation.constraints.NotNull;
  5. @Data
  6. @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
  7. public class GetCustomerRequest {
  8. @NotNull(message = "pkid不能为空。")
  9. private Integer pkid;
  10. }

GetCustomerResponse代码:

  1. package com.william.facade.reponse;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import lombok.Data;
  4. @Data
  5. @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
  6. public class GetCustomerResponse {
  7. private Integer pkid;
  8. private String customerName;
  9. private String company;
  10. private String sex;
  11. }

ok,facade项目完毕,后续威哥会使用到。

5、创建消费者:service-consumer

创建步骤通服务生产者

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 21

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 22

得到如下项目结构:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 23

pom.xml如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.2.6.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.william</groupId>
  12. <artifactId>consumer</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>service-consumer</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. <exclusions>
  30. <exclusion>
  31. <groupId>org.junit.vintage</groupId>
  32. <artifactId>junit-vintage-engine</artifactId>
  33. </exclusion>
  34. </exclusions>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-web</artifactId>
  39. </dependency>
  40. </dependencies>
  41. <dependencyManagement>
  42. <dependencies>
  43. <dependency>
  44. <groupId>org.springframework.cloud</groupId>
  45. <artifactId>spring-cloud-dependencies</artifactId>
  46. <version>${spring-cloud.version}</version>
  47. <type>pom</type>
  48. <scope>import</scope>
  49. </dependency>
  50. </dependencies>
  51. </dependencyManagement>
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <groupId>org.springframework.boot</groupId>
  56. <artifactId>spring-boot-maven-plugin</artifactId>
  57. </plugin>
  58. </plugins>
  59. </build>
  60. </project>

application.properties配置如下:

  1. eureka.client.service-url.defaultZone=http://localhost:9010/eureka/
  2. server.port=9012
  3. spring.application.name=service-consumer
  4. server.tomcat.uri-encoding=utf-8
  5. spring.http.encoding.charset=utf-8
  6. spring.http.encoding.enabled=true
  7. spring.http.encoding.force=true
  8. spring.cloud.loadbalancer.ribbon.enabled=false

启动项ServiceConsumerApplication 内容:

  1. package com.william.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.context.annotation.Bean;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.client.RestTemplate;
  9. @SpringBootApplication
  10. @EnableDiscoveryClient
  11. @RestController
  12. public class ServiceConsumerApplication {
  13. public static void main(String[] args) {
  14. SpringApplication.run(ServiceConsumerApplication.class, args);
  15. }
  16. @Bean
  17. @LoadBalanced
  18. RestTemplate restTemplate(){
  19. return new RestTemplate();
  20. }
  21. }

注意:上面重写了restTemplate,这个是为了演示基础的Ribbon消费RPC服务,但是威哥已经不使用它了,主要是为了完整的给同学们演示下。

调试起来service-consumer,再刷新下服务注册中心:会发现消费者也注入到了服务注册中心,这样是为了后面连接保持心跳,才能取到RPC调用所需的服务路由,Eureka是客户端负载均衡,会在消费者这一侧事先存储一份生产者的服务路由,这是需要保持心跳机制的,也是为后续威哥介绍Feign做的铺垫。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 24

6、service-consumer开始消费服务

新建一个TestController:

  1. package com.william.consumer;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestParam;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import org.springframework.web.client.RestTemplate;
  7. @RestController
  8. @RequestMapping("service-consumer")
  9. public class TestController {
  10. @Autowired
  11. RestTemplate restTemplate;
  12. @RequestMapping("/sayHello")
  13. public String sayHello(@RequestParam String info){
  14. return restTemplate.getForObject(String.format("http://service-producer/service-producer-test/mytest?name=%s", info), String.class);
  15. }
  16. }

运行起来,在浏览器输入:http://localhost:9012/service-consumer/sayHello?info=吴三桂

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 25

ok,到此我们已经使用Ribbon成功消费了服务。基本上同学们已经算是搭建成功了SpringCloud框架。如果不想继续跟着威哥深造,可以就此打住退出了,记得帮威哥点赞哈。

7、开启Feign的愉快模式

新建service-remote项目,同facade,步骤威哥就不再截图了,需要删除启动项和resources资源包(用不上)。

此时威哥就用上了service-facade。

但是除了删除启动类,还需要额外加入web引用,可以在pom中灌进去,也可以按照威哥下面操作把web项添加进去:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 26

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 27

最终得到的项目结构:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 28

pom.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.2.6.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.william</groupId>
  12. <artifactId>remote</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>service-remote</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-function-context</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-web</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.cloud</groupId>
  35. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.cloud</groupId>
  39. <artifactId>spring-cloud-starter-feign</artifactId>
  40. <version>1.4.7.RELEASE</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter-test</artifactId>
  45. <scope>test</scope>
  46. <exclusions>
  47. <exclusion>
  48. <groupId>org.junit.vintage</groupId>
  49. <artifactId>junit-vintage-engine</artifactId>
  50. </exclusion>
  51. </exclusions>
  52. </dependency>
  53. <dependency>
  54. <groupId>com.william</groupId>
  55. <artifactId>facade</artifactId>
  56. <version>0.0.1-SNAPSHOT</version>
  57. <scope>compile</scope>
  58. </dependency>
  59. <dependency>
  60. <groupId>com.william</groupId>
  61. <artifactId>facade</artifactId>
  62. <version>0.0.1-SNAPSHOT</version>
  63. <scope>compile</scope>
  64. </dependency>
  65. </dependencies>
  66. <dependencyManagement>
  67. <dependencies>
  68. <dependency>
  69. <groupId>org.springframework.cloud</groupId>
  70. <artifactId>spring-cloud-dependencies</artifactId>
  71. <version>${spring-cloud.version}</version>
  72. <type>pom</type>
  73. <scope>import</scope>
  74. </dependency>
  75. </dependencies>
  76. </dependencyManagement>
  77. <build>
  78. <plugins>
  79. <plugin>
  80. <groupId>org.springframework.boot</groupId>
  81. <artifactId>spring-boot-maven-plugin</artifactId>
  82. </plugin>
  83. </plugins>
  84. </build>
  85. </project>

新建CustomerRemote接口:

  1. package com.william.remote;
  2. import com.william.facade.reponse.GetCustomerResponse;
  3. import com.william.facade.request.GetCustomerRequest;
  4. import org.springframework.cloud.openfeign.FeignClient;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import javax.validation.Valid;
  8. import java.util.List;
  9. @FeignClient(name = "service-producer")
  10. public interface CustomerRemote {
  11. @PostMapping(value = "/service-producer/getCustomer")
  12. List<GetCustomerResponse> getCustomer(@RequestBody(required = true) @Valid GetCustomerRequest request);
  13. }

8、消费者通过Feign以RPC形式调用生产者的服务

现在再回头到消费者service-consumer,其启动项需求添加注解:@EnableFeignClients(basePackages = { “com.william.remote” })

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 29

新建CustomerController:

  1. package com.william.consumer;
  2. import com.william.facade.reponse.GetCustomerResponse;
  3. import com.william.facade.request.GetCustomerRequest;
  4. import com.william.remote.CustomerRemote;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.PostMapping;
  7. import org.springframework.web.bind.annotation.RequestBody;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import javax.validation.Valid;
  11. import java.util.List;
  12. @RestController
  13. @RequestMapping("service-consumer")
  14. public class CustomerController {
  15. @Autowired
  16. private CustomerRemote customerRemote;
  17. /**
  18. * 获取客户信息
  19. * @param request
  20. * @return
  21. * @author xuwei
  22. * @since 2020-04-11
  23. */
  24. @PostMapping(value = "/getCustomer")
  25. public List<GetCustomerResponse> getCustomer(@RequestBody(required = true) @Valid GetCustomerRequest request) {
  26. List<GetCustomerResponse> response = customerRemote.getCustomer(request);
  27. return response;
  28. }
  29. }

ok,现在重新启动service-consumer,打开postman,本篇篇幅太长了,威哥就不介绍怎么引入swagger了。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1d2VpX25ldA_size_16_color_FFFFFF_t_70 30

到此本篇威哥分享完毕。大家记得帮威哥点赞啊。希望能够真正开启你的第一行Spring Cloud代码。

如果需要源码,请下载威哥上传的源码:https://download.csdn.net/download/xuwei_net/12324163。Maven依赖威哥没有上传哈,请自行更新依赖。

发表评论

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

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

相关阅读