• [Spring Cloud 项目] Spring cloud 实现房源查询功能


     🍳作者:天海奈奈

    💭眼过千遍不如手锤一遍:推荐一款模拟面试,斩获大厂 o f f e r ,程序员的必备刷题平台 − − 牛客网 

    👉🏻点击开始刷题之旅

    目录

    前言

    核心组件

    服务注册中心

    服务调用方式

    服务网关

    断路器

    数据库设计

    1 项目搭建

    1.1添加依赖

    2  开发房源查询模块:

    2.1 house-list 模块 

    2.1.1模块总览:​编辑

    2 .1.2写配置文件  创建application.properties

    2.1.3 依赖项配置

    2.1.3 启动类

    2.1.4 controller

    2.1.5 创建entity实体类,实现set /get 方法并用自动生成重写toString方法。

    2.1.6 service

    2.2 房价模块

    2.2.1 总览

    2.2.2 配置文件与依赖

    2.2.3 启动类

    2.2.4 client

    2.2.5 controller 

    2.2.6 service

    2.2.7 实体类

    2.2.8 mapper

    3 Eureka 开发

    Eureka client改写

    3.1模块总览​编辑

    3.2 配置文件与依赖

    3.3 启动类

    4 负载均衡

    4.1负载均衡策略

    4.2 为price模块配置负载均衡

    5 断路器

    6 网关

    6.1 模块总览​编辑

    6.2 配置文件与依赖

    6.3 启动类

     6.4 过滤器

    总结


     

    前言

    这个项目的功能很简单只涉及了查询功能,这个项目的的目的是熟悉SpringCloud框架,明白服务与服务之间的调用是通过http请求完成的使用微服务的架构而Feign可以使其像调用本地方法一样,学会在其他模块调用另一模块的服务和内容,完成负载均衡,学会将不同端口注册到eureka ,了解网关并会配置网关和使用断路器。

    核心组件

    服务注册中心

    Spring Cloud Netflix Eureka

    服务调用方式

    REST API、Feign、 Ribbon

    服务网关

    Spring Cloud Netflix Zuul

    断路器

    Spring Cloud Netflix Hystrix

    数据库设计

    由于本项目只是为了完整的实现SpringCloud项目并明白框架功能故只设计查询功能,所以只设计两张表

    表1 house

    109c2c8f1f104a2f95a94c4d0b77d4b0.png

    表2 c5422376eddb438b9a86f86ffe21c7e8.png

    1 项目搭建

    本项目是一个多模块项目,创建一个 Spring Initializr 项目 不自动添加依赖项,完成创建后删除自带的src目录,并在根目录下创建新的maven模块。

    1.1添加依赖

    1. "1.0" encoding="UTF-8"?>
    2. "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. 4.0.0
    5. pom
    6. <module>house-servermodule>
    7. <module>eureak-servermodule>
    8. <module>house-zuulmodule>
    9. org.springframework.boot
    10. spring-boot-starter-parent
    11. 2.1.12.RELEASE
    12. com.xatu
    13. spring-cloud-house-test1
    14. 0.0.1-SNAPSHOT
    15. spring-cloud-house-test1
    16. spring-cloud-house-test1
    17. 1.8
    18. org.springframework.boot
    19. spring-boot-starter
    20. org.springframework.boot
    21. spring-boot-starter-test
    22. test
    23. org.springframework.cloud
    24. spring-cloud-dependencies
    25. Greenwich.SR5
    26. pom
    27. import
    28. org.springframework.boot
    29. spring-boot-maven-plugin

    2  开发房源查询模块:

    2.1 house-list 模块 

    2.1.1模块总览:e5d5c8a511dd4ed6a01cafbcec98ba32.png

    端口号 8081 url接口 /house  

    参数名称 :null

    参数类型 : null 

    说明 : 找到上线房源 打印list

     

    2 .1.2写配置文件  创建application.properties

    1. server.port=8081
    2. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    3. spring.datasource.url=jdbc:mysql://localhost:3306/house_test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    4. spring.datasource.username=root
    5. spring.datasource.password=123456
    6. logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}
    7. mybatis.configuration.map-underscore-to-camel-case=true
    8. spring.application.name=house-list
    9. eureka.client.service-url.defaultZone=http://localhost:8000/eureka/

    2.1.3 依赖项配置

    1. "1.0" encoding="UTF-8"?>
    2. "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. house-server
    6. com.xatu
    7. 0.0.1-SNAPSHOT
    8. 4.0.0
    9. houser-list
    10. 8
    11. 8
    12. org.springframework.boot
    13. spring-boot-starter-web
    14. mysql
    15. mysql-connector-java
    16. org.mybatis.spring.boot
    17. mybatis-spring-boot-starter
    18. 2.1.1
    19. org.springframework.cloud
    20. spring-cloud-starter-netflix-eureka-client
    21. org.springframework.boot
    22. spring-boot-maven-plugin

    2.1.3 启动类

    1. /**
    2. * 描述: 项目启动类
    3. */
    4. @SpringBootApplication
    5. @EnableEurekaClient
    6. public class HouseListApplication {
    7. public static void main(String[] args) {
    8. SpringApplication.run(HouseListApplication.class, args);
    9. }

    2.1.4 controller

    1. /**
    2. * 描述: CourseListController课程列表Controller
    3. */
    4. @RestController//将返结果是json对象
    5. public class HouseListController {
    6. @Autowired
    7. HouseListService houseListService;
    8. @GetMapping("/house")
    9. public List<House> houseList() {
    10. return houseListService.getCourseList();
    11. }
    12. }

    2.1.5 创建entity实体类,实现set /get 方法并用自动生成重写toString方法。

    1. /**
    2. * 描述: House实体类
    3. */
    4. public class House implements Serializable {
    5. Integer id;
    6. Integer houseId;
    7. String houseName;
    8. Integer valid;
    9. @Override
    10. public String toString() {
    11. return "Course{" +
    12. "id=" + id +
    13. ", courseId=" + houseId +
    14. ", courseName='" + houseName + '\'' +
    15. ", valid=" + valid +
    16. '}';
    17. }
    18. public Integer getId() {
    19. return id;
    20. }
    21. public void setId(Integer id) {
    22. this.id = id;
    23. }
    24. public Integer getHouseId() {
    25. return houseId;
    26. }
    27. public void setHouseId(Integer houseId) {
    28. this.houseId = houseId;
    29. }
    30. public String getHouseName() {
    31. return houseName;
    32. }
    33. public void setHouseName(String houseName) {
    34. this.houseName = houseName;
    35. }
    36. public Integer getValid() {
    37. return valid;
    38. }
    39. public void setValid(Integer valid) {
    40. this.valid = valid;
    41. }
    42. }

    2.1.6 service

    1. /**
    2. * 描述: 房源列表服务
    3. */
    4. public interface HouseListService {
    5. List getCourseList();
    6. }

    impl 实现类

    1. @Service
    2. public class HouseListServiceImpl implements HouseListService {
    3. @Autowired
    4. HouseMapper houseMapper;
    5. @Override
    6. public List getCourseList() {
    7. return houseMapper.findValidCourses();
    8. }
    9. }

    mapper

    1. /**
    2. * 描述: 房源的Mapper类
    3. */
    4. @Mapper
    5. @Repository
    6. public interface HouseMapper {
    7. @Select("SELECT * FROM house WHERE valid = 1")
    8. List findValidCourses();
    9. }

    这里实现的是查询已上线的房源。

    2.2 房价模块

    2.2.1 总览

    77fb77b472cf4f39bf93a787d5666c73.png

     

    端口号 8083

     url接口 /price

    参数名称 :houseId

    参数类型 : int

    说明 : 获取到对应房源id的价格

     

     url接口 /HouseInPrice

    参数名称 :null

    参数类型 : null

    说明 : 作用与/list/house类似只是为了测试引入功能

     

     url接口 /houseAndPrice

    参数名称 :null

    参数类型 : null

    说明 : 获取到房子id 价格 id 名字

     

    2.2.2 配置文件与依赖

    1. server.port=8082
    2. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    3. spring.datasource.url=jdbc:mysql://localhost:3306/house_test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    4. spring.datasource.username=root
    5. spring.datasource.password=123456
    6. logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}
    7. #tuo feng ming ming zhuan huan
    8. mybatis.configuration.map-underscore-to-camel-case=true
    9. spring.application.name=house-price
    10. eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
    11. house-list.ribbon.NFLoadBanlancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule
    12. feign.hystrix.enabled=true
    1. "1.0" encoding="UTF-8"?>
    2. "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. house-server
    6. com.xatu
    7. 0.0.1-SNAPSHOT
    8. 4.0.0
    9. house-price
    10. 8
    11. 8
    12. org.springframework.boot
    13. spring-boot-starter-web
    14. mysql
    15. mysql-connector-java
    16. org.mybatis.spring.boot
    17. mybatis-spring-boot-starter
    18. 2.1.1
    19. org.springframework.cloud
    20. spring-cloud-starter-netflix-eureka-client
    21. org.springframework.cloud
    22. spring-cloud-starter-openfeign
    23. org.springframework.cloud
    24. spring-cloud-starter-netflix-hystrix
    25. com.xatu
    26. houser-list
    27. 0.0.1-SNAPSHOT
    28. compile
    29. org.springframework.boot
    30. spring-boot-maven-plugin

    2.2.3 启动类

    1. /**
    2. * 描述: 项目启动类
    3. */
    4. @SpringBootApplication
    5. @EnableEurekaClient
    6. @EnableFeignClients
    7. @EnableCircuitBreaker
    8. public class HousePriceApplication {
    9. public static void main(String[] args) {
    10. SpringApplication.run(HousePriceApplication.class, args);
    11. }
    12. }

     

    2.2.4 client

    1. /**
    2. * 描述: 房源列表的Feign客户端
    3. */
    4. //当远端服务出现问题会进入这个类
    5. @FeignClient(value = "house-list" ,fallback = HouseListClientHystrix.class)
    6. //有多个实例时,带有注解的人就是注入的
    7. @Primary
    8. public interface HouseListClient {
    9. @GetMapping("/house")
    10. public List houseList();
    11. }

    如果不用feign 不同服务是不能进行调用的,我们在需要使用整合服务的模块中引入依赖 ,我加了注释了,再在启动类中加入注解,并创建一个类来作为我们引入模块的feign客户端,直接从我们想要引入的服务的controller中复制即可,引入后会有提示,要引入对另一个模块的依赖,就能数显服务的整合了。

    1. /**
    2. * 描述: 断路器实现类
    3. */
    4. @Component
    5. public class HouseListClientHystrix implements HouseListClient {
    6. @Override
    7. public List houseList() {
    8. List defaultCourses = new ArrayList<>();
    9. House House = new House();
    10. House.setId(1);
    11. House.setHouseId(1);
    12. House.setHouseName("默认房源");
    13. House.setValid(1);
    14. defaultCourses.add(House);
    15. return defaultCourses;
    16. }
    17. }

    发生错误时调用的类,给服务的返回是默认的返回值 @Component 注解使它成为一个组件

    2.2.5 controller 

    1. /**
    2. * 描述: 房价格控制器
    3. */
    4. @RestController
    5. public class HousePriceController {
    6. @Autowired
    7. HousePriceService housePriceService;
    8. @Autowired
    9. HouseListClient houseListClient;
    10. @GetMapping("/price")
    11. public Integer getCoursePrice(Integer houseId) {
    12. HousePrice housePrice = housePriceService.getHousePrice(houseId);
    13. return housePrice.getPrice();
    14. }
    15. @GetMapping("/HouseInPrice")
    16. public List getHouseListInPrice(Integer houseId) {
    17. List houses = houseListClient.houseList();
    18. return houses;
    19. }
    20. @GetMapping("/houseAndPrice")
    21. public List getCoursesAndPrice() {
    22. List houseAndPrice = housePriceService.getHousesAndPrice();
    23. return houseAndPrice;
    24. }
    25. }

    2.2.6 service

     

    1. /**
    2. * 描述: 房价格服务
    3. */
    4. public interface HousePriceService {
    5. HousePrice getHousePrice(Integer houseId);
    6. List getHousesAndPrice();
    7. List getHousePriceList();
    8. }

    impl 

    1. /**
    2. * 描述: 课程价格的服务实现类
    3. */
    4. @Service
    5. public class HousePriceServiceImpl implements HousePriceService {
    6. @Autowired
    7. HousePriceMapper housePriceMapper;
    8. @Autowired
    9. HouseListClient houseListClient;
    10. @Override
    11. public HousePrice getHousePrice(Integer houseId) {
    12. return housePriceMapper.findCoursePrice(houseId);
    13. }
    14. @Override
    15. public List getHousesAndPrice() {
    16. List houseAndPricesList = new ArrayList<>();
    17. List houses = houseListClient.houseList();
    18. for(int i = 0;i < houses.size();i++){
    19. House house = houses.get(i);
    20. if(house != null){
    21. HousePrice housePrice = getHousePrice(house.getHouseId());
    22. HouseAndPrice houseAndPrice = new HouseAndPrice();
    23. houseAndPrice.setPrice(housePrice.getPrice());
    24. houseAndPrice.setName(house.getHouseName());
    25. houseAndPrice.setId(house.getId());
    26. houseAndPrice.setHouseId(house.getHouseId());
    27. houseAndPricesList.add(houseAndPrice);
    28. }
    29. }
    30. return houseAndPricesList;
    31. }
    32. @Override
    33. public List getHousePriceList() {
    34. return housePriceMapper.getAll();
    35. }
    36. }

    第二个方法就体现除了服务的整合,我们并不用去进行多表查询,只需要调用其他服务就能快捷完成。

    2.2.7 实体类

    1. /**
    2. * 融合类
    3. *
    4. */
    5. public class HouseAndPrice {
    6. Integer id;
    7. Integer houseId;
    8. String name;
    9. Integer price;
    10. @Override
    11. public String toString() {
    12. return "HouseAndPrice{" +
    13. "id=" + id +
    14. ", houseId=" + houseId +
    15. ", name='" + name + '\'' +
    16. ", price=" + price +
    17. '}';
    18. }
    19. public Integer getId() {
    20. return id;
    21. }
    22. public void setId(Integer id) {
    23. this.id = id;
    24. }
    25. public Integer getHouseId() {
    26. return houseId;
    27. }
    28. public void setHouseId(Integer houseId) {
    29. this.houseId = houseId;
    30. }
    31. public String getName() {
    32. return name;
    33. }
    34. public void setName(String name) {
    35. this.name = name;
    36. }
    37. public Integer getPrice() {
    38. return price;
    39. }
    40. public void setPrice(Integer price) {
    41. this.price = price;
    42. }
    43. }
    1. public class HousePrice implements Serializable {
    2. Integer id;
    3. Integer houseId;
    4. Integer price;
    5. @Override
    6. public String toString() {
    7. return "HousePrice{" +
    8. "id=" + id +
    9. ", houseId=" + houseId +
    10. ", price=" + price +
    11. '}';
    12. }
    13. public Integer getId() {
    14. return id;
    15. }
    16. public void setId(Integer id) {
    17. this.id = id;
    18. }
    19. public Integer getHouseId() {
    20. return houseId;
    21. }
    22. public void setHouseId(Integer houseId) {
    23. this.houseId = houseId;
    24. }
    25. public Integer getPrice() {
    26. return price;
    27. }
    28. public void setPrice(Integer price) {
    29. this.price = price;
    30. }
    31. }

    2.2.8 mapper

    1. /**
    2. * 描述: 房价格Mapper类
    3. */
    4. @Mapper
    5. @Repository
    6. public interface HousePriceMapper {
    7. @Select("SELECT * FROM house_price WHERE house_id = #{houseId}")
    8. HousePrice findCoursePrice(Integer courseId);
    9. @Select("SELECT * FROM house_price" )
    10. List getAll();
    11. }

    3 Eureka 开发

    Eureka server服务注册与管理的中心 生产者,提供者

    调用方:

    提供者把自己的信息注册到上面,server就能掌握最新的动态,调用方去调用服务是,会先去获取最新的地址,获取地址之后再去进行实际的调用。

    Eureka 开发多了获取地址这一步是对ip服务进行解耦 。

    Eureka client改写

    我们把强两个模块进行Eureka Client改写也很简单,只用在启动类上加注解

    @EnableEurekaClient

    在配置文件上进行配置

    eureka.client.service-url.defaultZone=http://localhost:8000/eureka/ 

    我们eureka端口号多少8000那项就是多少 

    3.1模块总览68bb67a5b45743a5a3e2dfdbbce453b9.png

     

    3.2 配置文件与依赖

    1. spring.application.name=eureka-server
    2. server.port=8000
    3. eureka.instance.hostname=localhost
    4. #?????
    5. eureka.client.fetch-registry=false
    6. #?????????
    7. eureka.client.register-with-eureka=false
    8. eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

     第一个注释是获取注册表。不需要同步其他节点数据

    第二个注释是是否发自己也注册上去

    1. "1.0" encoding="UTF-8"?>
    2. "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. spring-cloud-house-test1
    6. com.xatu
    7. 0.0.1-SNAPSHOT
    8. 4.0.0
    9. eureak-server
    10. 8
    11. 8
    12. course-eureka-server
    13. Spring Cloud Eureka
    14. org.springframework.cloud
    15. spring-cloud-starter-netflix-eureka-server
    16. org.springframework.boot
    17. spring-boot-maven-plugin

    3.3 启动类

    1. /**
    2. * 描述: Eureka服务端
    3. */
    4. //eurekaserver启动
    5. @EnableEurekaServer
    6. @SpringBootApplication
    7. public class EurekaServerApplication {
    8. public static void main(String[] args) {
    9. SpringApplication.run(EurekaServerApplication.class, args);
    10. }
    11. }

    9f799e8909794d15ab8c9aaab5ec3559.png

    这样就证明我们的服务已经注册上去了

    4 负载均衡

    4.1负载均衡策略


    RandomRule表示随机策略
    RoundRobinRule 表示轮询策略
    Response TimeWeightedRule加权,根据每一个Server的平均响应时间动态加权

    4.2 为price模块配置负载均衡

    其实就是在配置文件中加一行

    house-list.ribbon.NFLoadBanlancerRuleClassName=com.netflix.loadbalancer.RoundRobinRuley
    
    意思就是对house-list服务调用的时候采取的负载均衡的策略。

    5 断路器

    起到一个兜底的作用,有些时候一个服务出现问题,我们不希望整个系统都崩溃掉,那我们可以采取降级的手段,虽然不能返回正常的数据却可以保证系统正常运行。运用断路器我们不仅要配置配置文件,加依赖,还要书写一个短路类(参见price模块下client 下的断路器实现类)

    6 网关

     

    6.1 模块总览433323b2572d4640a3d762dc5cd6f45c.png

    6.2 配置文件与依赖

    1. "1.0" encoding="UTF-8"?>
    2. "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. spring-cloud-house-test1
    6. com.xatu
    7. 0.0.1-SNAPSHOT
    8. 4.0.0
    9. house-zuul
    10. 8
    11. 8
    12. org.springframework.cloud
    13. spring-cloud-starter-netflix-eureka-client
    14. org.springframework.cloud
    15. spring-cloud-starter-netflix-zuul
    16. org.springframework.boot
    17. spring-boot-maven-plugin
    1. spring.application.name=house-gateway
    2. server.port=9000
    3. logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}
    4. mybatis.configuration.map-underscore-to-camel-case=true
    5. eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
    6. #???????
    7. zuul.prefix=/xatu
    8. zuul.routes.house-list.path=/list/**
    9. zuul.routes.house-list.service-id=house-list
    10. zuul.routes.house-price.path=/price/**
    11. zuul.routes.house-price.service-id=house-price

    6.3 启动类

    1. /**
    2. * 描述: 网关启动类
    3. */
    4. //网关注解
    5. @EnableZuulProxy
    6. @SpringCloudApplication
    7. public class ZuulGatewayApplication {
    8. public static void main(String[] args) {
    9. SpringApplication.run(ZuulGatewayApplication.class, args);
    10. }
    11. }

     6.4 过滤器

    pre 过滤器在路由请求之前运行
    route 过滤器可以处理请求的实际路由
    post 路由请求后运行过滤器
    error如果在处理请求的过程中发生错误,则过滤器将运行

    这里写一个前置一个后置

    1. /**
    2. * 描述: 前置过滤器
    3. */
    4. @Component
    5. public class PreRequestFilter extends ZuulFilter {
    6. //指定过滤器类别
    7. @Override
    8. public String filterType() {
    9. return FilterConstants.PRE_TYPE;
    10. }
    11. //顺序
    12. @Override
    13. public int filterOrder() {
    14. return 5;
    15. }
    16. //是不是走过滤器可以添加判断
    17. @Override
    18. public boolean shouldFilter() {
    19. return true;
    20. }
    21. //通过过滤器将要实现的逻辑----打印出请求url
    22. @Override
    23. public Object run() throws ZuulException {
    24. RequestContext currentContext = RequestContext.getCurrentContext();
    25. //获取当前请求uri
    26. System.out.println("URI:" + currentContext.getRequest().getRequestURI());
    27. return null;
    28. }
    29. }
    1. /**
    2. * 描述: 后置过滤器
    3. */
    4. @Component
    5. public class PostRequestFilter extends ZuulFilter {
    6. @Override
    7. public String filterType() {
    8. return FilterConstants.POST_TYPE;
    9. }
    10. @Override
    11. public int filterOrder() {
    12. return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
    13. }
    14. @Override
    15. public boolean shouldFilter() {
    16. return true;
    17. }
    18. //打印返回状态码
    19. @Override
    20. public Object run() throws ZuulException {
    21. RequestContext currentContext = RequestContext.getCurrentContext();
    22. int status = currentContext.getResponse().getStatus();
    23. System.out.println("response status:" + status);
    24. return null;
    25. }
    26. }

     浏览器输入http://127.0.0.1:9000/xatu/house-list/house


    040959bcf7384c17bac169d91c283fff.png

     572dbb0a5e9b41019f4c0a094aa78a95.png可以看书过滤器也实现了

    总结

    1 通过这个项目我们了解了SpringCloud的几个重要组件

    2 数据流向ed3d294d83484bf3adda4cde3756a7cf.jpeg

    3 完成两个模块开发后进行了服务注册与发现Eureka

    4 为了使服务间调用更加简便使用了Feign组件

    5 使用到了负载均衡

    6 使用到了熔断器

    7 使用网关,并进行了过滤器的编写

    ---------------------------------------------------------------------------------------------------------------------------------写文不易,在这里求个三连了╥﹏╥

    下次更新SpringCloud项目时会放一个功能齐全框架完整的电商项目具体上不上线等项目写完再说。

     

     

     

  • 相关阅读:
    leetcode 39. 组合总和(完全背包问题)
    程序员都无法理解的代码
    酷开系统走在前列,品牌重启增长,酷开科技成为品牌商合作目标
    STM32进阶:使用STM32驱动ST7735S(内附核心源码)
    设计模式——组合模式
    Java摆烂基础学习二~运算符
    【神经网络】梯度消失与梯度爆炸问题
    面试大厂Java工程师后整理份300+页Java面试宝典
    Shell:一键部署pxe
    maven中relativepath标签的含义
  • 原文地址:https://blog.csdn.net/weixin_57169969/article/details/126678677