• 19.Feign 的工程化实例:eureka,ribbon,feign,hystrix(springcloud)


    项目模型

     

    项目结构

    本实例创建model都是通过maven手动创建,依赖进行手动导入,好处是比使用springboot模板创建更加灵活,更方便的进行父子模块的管理。

    1.创建父项目feign-project

     2.对父项目feign-project的pom.xml,进行手动导入依赖

    1. "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.0modelVersion>
    6. <modules>
    7. <module>domain-projectmodule>
    8. <module>common-apimodule>
    9. <module>user-centermodule>
    10. <module>order-centermodule>
    11. modules>
    12. <parent>
    13. <groupId>org.springframework.bootgroupId>
    14. <artifactId>spring-boot-starter-parentartifactId>
    15. <version>2.3.12.RELEASEversion>
    16. <relativePath/>
    17. parent>
    18. <packaging>pompackaging>
    19. <groupId>com.itgroupId>
    20. <artifactId>fegin-projectartifactId>
    21. <version>0.0.1-SNAPSHOTversion>
    22. <properties>
    23. <java.version>1.8java.version>
    24. <spring-cloud.version>Hoxton.SR12spring-cloud.version>
    25. properties>
    26. <dependencies>
    27. <dependency>
    28. <groupId>org.projectlombokgroupId>
    29. <artifactId>lombokartifactId>
    30. <optional>trueoptional>
    31. dependency>
    32. dependencies>
    33. <dependencyManagement>
    34. <dependencies>
    35. <dependency>
    36. <groupId>org.springframework.cloudgroupId>
    37. <artifactId>spring-cloud-dependenciesartifactId>
    38. <version>${spring-cloud.version}version>
    39. <type>pomtype>
    40. <scope>importscope>
    41. dependency>
    42. dependencies>
    43. dependencyManagement>
    44. project>

    3.domain-project子模块的创建

    3.1使用maven进行创建,选择父项目为feign-project

    2.pom.xml文件

    1. "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>fegin-projectartifactId>
    7. <groupId>com.itgroupId>
    8. <version>0.0.1-SNAPSHOTversion>
    9. parent>
    10. <modelVersion>4.0.0modelVersion>
    11. <groupId>com.itgroupId>
    12. <artifactId>domain-projectartifactId>
    13. project>

    3.3创建实体类Order

    1. package com.it.domain;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Builder;
    4. import lombok.Data;
    5. import lombok.NoArgsConstructor;
    6. @Data
    7. @NoArgsConstructor
    8. @AllArgsConstructor
    9. @Builder
    10. public class Order {
    11. private Integer orderId;
    12. private String name;
    13. private Double price;
    14. }

    4.common-api子模块的创建

    4.1.使用maven进行创建,选择父项目为feign-project

    4.2.pom.xml文件

    1. "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>fegin-projectartifactId>
    7. <groupId>com.itgroupId>
    8. <version>0.0.1-SNAPSHOTversion>
    9. parent>
    10. <modelVersion>4.0.0modelVersion>
    11. <groupId>com.itgroupId>
    12. <artifactId>common-apiartifactId>
    13. <dependencies>
    14. <dependency>
    15. <groupId>com.itgroupId>
    16. <artifactId>domain-projectartifactId>
    17. <version>0.0.1-SNAPSHOTversion>
    18. dependency>
    19. <dependency>
    20. <groupId>org.springframework.cloudgroupId>
    21. <artifactId>spring-cloud-starter-openfeignartifactId>
    22. dependency>
    23. <dependency>
    24. <groupId>org.springframework.cloudgroupId>
    25. <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
    26. dependency>
    27. dependencies>
    28. project>

    4.3UserOrderFeign接口,做远程调用的接口

    1. package com.it.feign;
    2. import com.it.domain.Order;
    3. import com.it.feign.hystrix.UserOrderFeignHystrix;
    4. import org.springframework.cloud.openfeign.FeignClient;
    5. import org.springframework.web.bind.annotation.GetMapping;
    6. import org.springframework.web.bind.annotation.RequestParam;
    7. @FeignClient(value = "order-service",fallback = UserOrderFeignHystrix.class)
    8. public interface UserOrderFeign {
    9. //查询订单
    10. @GetMapping("/order/getOrderByUserById")
    11. Order getOrderByUserById(@RequestParam Integer userId);
    12. }

    4.4UserOrderFeignHystrix实现类,做熔断器调用的方法

    1. package com.it.feign.hystrix;
    2. import com.it.domain.Order;
    3. import com.it.feign.UserOrderFeign;
    4. import org.springframework.stereotype.Component;
    5. @Component
    6. public class UserOrderFeignHystrix implements UserOrderFeign {
    7. /**
    8. * 一般远程调用的熔断可以直接返回一个null值
    9. * @param userId
    10. * @return
    11. */
    12. @Override
    13. public Order getOrderByUserById(Integer userId) {
    14. return null;
    15. }
    16. }

    5.order-center子模块的创建

    5.1使用maven进行创建,选择父项目为feign-project

     5.2pom.xml文件

    1. "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>fegin-projectartifactId>
    7. <groupId>com.itgroupId>
    8. <version>0.0.1-SNAPSHOTversion>
    9. parent>
    10. <modelVersion>4.0.0modelVersion>
    11. <groupId>com.itgroupId>
    12. <artifactId>order-centerartifactId>
    13. <dependencies>
    14. <dependency>
    15. <groupId>com.itgroupId>
    16. <artifactId>common-apiartifactId>
    17. <version>0.0.1-SNAPSHOTversion>
    18. dependency>
    19. <dependency>
    20. <groupId>org.springframework.bootgroupId>
    21. <artifactId>spring-boot-starter-webartifactId>
    22. dependency>
    23. <dependency>
    24. <groupId>org.springframework.cloudgroupId>
    25. <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    26. dependency>
    27. dependencies>
    28. <build>
    29. <plugins>
    30. <plugin>
    31. <groupId>org.springframework.bootgroupId>
    32. <artifactId>spring-boot-maven-pluginartifactId>
    33. plugin>
    34. plugins>
    35. build>
    36. project>

    5.3application.yml文件

    1. server:
    2. port: 8080
    3. spring:
    4. application:
    5. name: order-service
    6. eureka:
    7. client:
    8. service-url:
    9. defaultZone: http://192.168.174.133:8761/eureka
    10. instance:
    11. hostname: localhost
    12. instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}

    5.4OrderController类,实现另一个子模块common-api的UserOrderFeign接口,重写接口中的方法

    1. package com.it.controller;
    2. import com.it.domain.Order;
    3. import com.it.feign.UserOrderFeign;
    4. import org.springframework.web.bind.annotation.RestController;
    5. @RestController
    6. public class OrderController implements UserOrderFeign {
    7. @Override
    8. public Order getOrderByUserById(Integer userId) {
    9. System.out.println(userId);
    10. Order order = Order.builder()
    11. .name("汉堡")
    12. .price(8D)
    13. .orderId(01)
    14. .build();
    15. return order;
    16. }
    17. }

    5.5主函数类

    1. package com.it;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    5. @SpringBootApplication
    6. @EnableEurekaClient
    7. public class OrderServiceApp {
    8. public static void main(String[] args) {
    9. SpringApplication.run(OrderServiceApp.class,args);
    10. }
    11. }

    6.创建子模块user-center

    6.1使用maven进行创建,选择父项目为feign-project

    6.2pom.xml文件

    1. "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>fegin-projectartifactId>
    7. <groupId>com.itgroupId>
    8. <version>0.0.1-SNAPSHOTversion>
    9. parent>
    10. <modelVersion>4.0.0modelVersion>
    11. <groupId>com.itgroupId>
    12. <artifactId>user-centerartifactId>
    13. <dependencies>
    14. <dependency>
    15. <groupId>com.itgroupId>
    16. <artifactId>common-apiartifactId>
    17. <version>0.0.1-SNAPSHOTversion>
    18. dependency>
    19. <dependency>
    20. <groupId>org.springframework.bootgroupId>
    21. <artifactId>spring-boot-starter-webartifactId>
    22. dependency>
    23. <dependency>
    24. <groupId>org.springframework.cloudgroupId>
    25. <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    26. dependency>
    27. dependencies>
    28. project>

    6.3application.yml文件

    1. server:
    2. port: 8081
    3. spring:
    4. application:
    5. name: user-service
    6. eureka:
    7. client:
    8. service-url:
    9. defaultZone: http://192.168.174.133:8761/eureka
    10. instance:
    11. hostname: localhost
    12. instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    13. feign:
    14. hystrix:
    15. enabled: true #开启熔断

    6.4UserController类,调用另一个子模块common-api的UserOrderFeign接口中的方法,进行远程调用

    1. package com.it.controller;
    2. import com.it.domain.Order;
    3. import com.it.feign.UserOrderFeign;
    4. import com.netflix.discovery.converters.Auto;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.web.bind.annotation.GetMapping;
    7. import org.springframework.web.bind.annotation.RestController;
    8. import javax.annotation.Resource;
    9. @RestController
    10. public class UserController {
    11. @Resource
    12. public UserOrderFeign userOrderFeign;
    13. @GetMapping("find")
    14. public Order findOrder(){
    15. Order orderByUserById = userOrderFeign.getOrderByUserById(01);
    16. return orderByUserById;
    17. }
    18. }

    6.5主函数类

    1. package com.it;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    5. import org.springframework.cloud.openfeign.EnableFeignClients;
    6. @SpringBootApplication
    7. @EnableEurekaClient
    8. @EnableFeignClients
    9. public class UserServiceApp {
    10. public static void main(String[] args) {
    11. SpringApplication.run(UserServiceApp.class,args);
    12. }
    13. }

    7.功能测试

    7.1oreder-center(8080),user-cneter(8081)都正常开启服务

     7.2当oreder-center(8080)服务宕机,进行开启熔断器,返回一个null值

  • 相关阅读:
    Springboot 引入第三方jar包,并打包运行
    【JVM学习笔记】JVM内存区域定义与内存结构
    微服务整合公众号告警系统
    cf1695D1. Tree Queries (Easy Version)(div2)【树上问题】
    理德名人故事:巴菲特传记,“股神”巴菲特的一生
    算法基础-数学知识-容斥原理、博弈论
    Mysql之用户管理
    十六进制转八进制 +扩展:进制数转换 蓝桥杯基础练习(难搞的东西)
    如何正确的清理C盘
    【FPGA】 3-8译码器 —— 组合逻辑 | 熟悉语法及开发环境
  • 原文地址:https://blog.csdn.net/weixin_59334478/article/details/127829523