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

news2025/4/18 9:59:41

项目模型

 

项目结构

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

1.创建父项目feign-project

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

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <modules>
        <module>domain-project</module>
        <module>common-api</module>
        <module>user-center</module>
        <module>order-center</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <packaging>pom</packaging>
    <groupId>com.it</groupId>
    <artifactId>fegin-project</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


</project>

3.domain-project子模块的创建

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

2.pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>fegin-project</artifactId>
        <groupId>com.it</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.it</groupId>
    <artifactId>domain-project</artifactId>




</project>

3.3创建实体类Order

package com.it.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Order {

    private Integer orderId;
    private String name;
    private Double price;

}

4.common-api子模块的创建

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

4.2.pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>fegin-project</artifactId>
        <groupId>com.it</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.it</groupId>
    <artifactId>common-api</artifactId>


    <dependencies>
        <dependency>
            <groupId>com.it</groupId>
            <artifactId>domain-project</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

    </dependencies>

</project>

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

package com.it.feign;

import com.it.domain.Order;
import com.it.feign.hystrix.UserOrderFeignHystrix;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(value = "order-service",fallback = UserOrderFeignHystrix.class)
public interface UserOrderFeign {

    //查询订单
    @GetMapping("/order/getOrderByUserById")
    Order getOrderByUserById(@RequestParam Integer userId);

}

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

package com.it.feign.hystrix;

import com.it.domain.Order;
import com.it.feign.UserOrderFeign;
import org.springframework.stereotype.Component;

@Component
public class UserOrderFeignHystrix implements UserOrderFeign {

    /**
     * 一般远程调用的熔断可以直接返回一个null值
     * @param userId
     * @return
     */
    @Override
    public Order getOrderByUserById(Integer userId) {
        return null;
    }
}

5.order-center子模块的创建

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

 5.2pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>fegin-project</artifactId>
        <groupId>com.it</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.it</groupId>
    <artifactId>order-center</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.it</groupId>
            <artifactId>common-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>



</project>

5.3application.yml文件

server:
  port: 8080
spring:
  application:
    name: order-service
eureka:
  client:
    service-url:
      defaultZone: http://192.168.174.133:8761/eureka
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}

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

package com.it.controller;

import com.it.domain.Order;
import com.it.feign.UserOrderFeign;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController implements UserOrderFeign {

    @Override
    public Order getOrderByUserById(Integer userId) {
        System.out.println(userId);
        Order order = Order.builder()
                .name("汉堡")
                .price(8D)
                .orderId(01)
                .build();
        return order;
    }

}

5.5主函数类

package com.it;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class OrderServiceApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApp.class,args);
    }
}

6.创建子模块user-center

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

6.2pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>fegin-project</artifactId>
        <groupId>com.it</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.it</groupId>
    <artifactId>user-center</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.it</groupId>
            <artifactId>common-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

    </dependencies>

</project>

6.3application.yml文件

server:
  port: 8081
spring:
  application:
    name: user-service
eureka:
  client:
    service-url:
      defaultZone: http://192.168.174.133:8761/eureka
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
feign:
  hystrix:
    enabled: true #开启熔断

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

package com.it.controller;

import com.it.domain.Order;
import com.it.feign.UserOrderFeign;
import com.netflix.discovery.converters.Auto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class UserController {


    @Resource
    public UserOrderFeign userOrderFeign;

    @GetMapping("find")
    public Order findOrder(){
        Order orderByUserById = userOrderFeign.getOrderByUserById(01);
        return orderByUserById;
    }

}

6.5主函数类

package com.it;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class UserServiceApp {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApp.class,args);
    }
}

7.功能测试

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础内容(10)—— 进程概念

目录 1.冯诺依曼体系结构 ​编辑1.冯诺依曼体系特点 2.cpu运算原理 3.数据传输 2.操作系统 1.操作系统管理的真相 2.操作系统与硬件的交互方式 3.操作系统与用户的交互方式 1.系统调用接口 2.用户对系统调用的使用 3.进程 1.进程的概念 2.Linux中的进程 3.与进程…

基于DJYOS的SPI驱动编写指导手册

1.贡献者列表 深圳市秦简计算机系统有限公司DJYOS驱动开发团队。 2.概述 DJYOS的DjyBus总线模型为IIC、SPI之类的器件提供统一的访问接口&#xff0c;SPIBUS模块是DjyBus模块的一个子模块&#xff0c;为SPI器件提供统一的编程接口&#xff0c;实现通信协议层与器件层的分离。…

Python 考试练习题 2

一、选择题 1、下列是 python 合法标识符的是&#xff08; B&#xff09;。 A. 2variable B. variable2 C. $anothervar D. if 2、在 python 中字符串的表示方式是&#xff08;D &#xff09;。 A.采用单引号包裹 B.采用双引号包裹 C.采用三重单引号包裹 D.ABC 都是 3、设有…

【浅学Linux】动态库与静态库的封装与使用

朋友们好&#xff0c;这里简单介绍一下LINUX学习中关于动态库与静态库的理解&#xff0c;以及站在封装和使用的角度去介绍是如何封装的&#xff1f;如何使用的&#xff1f; 文章目录一&#xff1a;动态库与静态库的理解二&#xff1a;静态库2.1&#xff1a;静态库的使用2.2&…

Sprite Editor

1、SpriteEditor SpriteEditor是精灵图片编辑器 它主要用于编辑2D游戏开发中使用的Sprite精灵图片 它可以用于编辑 图集中提取元素&#xff0c;设置精灵边框&#xff0c;设置九宫格&#xff0c;设置轴心&#xff08;中心&#xff09;点等等功能 2、Single图片编辑 Sprite Ed…

Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络

Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络Docker原生网络bridgeHostnoneDocker自定义网络自定义bridgeoverlaymacviandocker network所有基本命令Docker容器通信双冗余机制跨主机容器网络一些遗留错误解决错误1错误2错误3错误4Docker原生网络 docker安装时…

如何搭建node_exporter

如何搭建node_exporter 1.观看条件 1.假设你已经看过上一篇文章 《如何搭建普罗米修斯 Prometheus》 2.假设你已经会搭建普罗米修斯&#xff08;promethus&#xff09; 3.上面两个假设&#xff0c;只要满足一个。那你看这篇文章就没什么压力了 2.node_exporter是啥 node_…

UI自动化测试之selenium工具(浏览器窗口的切换)

目录 前言 方法 实例 ①示例1 ②示例2 附加知识 结语 前言 1、在浏览网页的时候&#xff0c;有时点击一个链接或者按钮&#xff0c;会弹出一个新的窗口。这类窗口也被称之为句柄&#xff08;一个浏览器窗口的唯一标识符&#xff0c;通过句柄实现不同浏览器窗口之间的切…

C++Qt开发——文件操作

简介 QT中的IO操作通过统一的接口简化了文件与外部设备的操作方式&#xff0c;QT中文件被当作一种特殊的外部设备&#xff0c;文件操作与外部设备操作相同。IO操作的本质是连续存储空间的数据读写。 1. IO设备的类型 顺序存取设备&#xff1a;只能从头开始顺序读写数据&#…

python游戏库pygame经典教程

目录 一.Pygame程序基本搭建过程 1.初始化化程序 2.创建Surface对象 3.事件监听 4.游戏循环 二.Pygame Display显示模块详解 1.将Surface对象粘贴至主窗口上 2.设置窗口主窗口 3.填充主窗口背景&#xff0c;参数值RGB 4.设置窗口标题 5.更新屏幕内容 6.pygame.display其他方…

C# VS2022 EF6 + Mysql8.0.31 CodeFirsts使用配置

文章目录环境安装Mysql8.0.31下载Mysql连接器Net版本安装VS2022创建工程添加Nuget包修改配置文件如下准备工作&#xff0c;创建一个Dbcontext类&#xff0c;代码如下打开程序包控制台输入命令第一步第二步第三步第四步简要介绍一下如何添加一个表思路添加User实体类修改dbconte…

NodeMcu arduino ESP8266 搭建mqtt服务(然也物联)以及使用

NodeMcu arduino ESP8266 搭建mqtt服务以及使用 本文章学习借鉴于太极创客团队&#xff0c;以表感谢。官网http://www.taichi-maker.com/ 操作步骤&#xff1a;我们注册然也物联平台&#xff0c;申请社区版本&#xff0c;进行测试。 文章目录NodeMcu arduino ESP8266 搭建mqtt…

【Python基础篇021】黏包现象丨udp的socket服务

&#x1f320;前言 基于udp的socket服务有什么特点&#xff1f;黏包现象是什么&#xff1f;又是如何产生的&#xff1f;udp和tcp哪种会有黏包现象&#xff1f;看完这篇文章相信你会有所收获。 目录 &#x1f320;一、基于udp的socket服务 &#x1f320;二、TCP中的黏包现象 …

保边滤波之引导滤波与领域转换滤波

&#xff08;1&#xff09;引导滤波 局部窗口内输出图像O和引导图像G成线性关系OiakGibk, ∀i∈Ωk 假设输出图像O和输入图像I之间的关系为OiIi−ni&#xff0c;噪声最小即最小化ni&#xff0c;即 每个像素点i包含于多个窗口Ωk&#xff0c;每个窗口都会得到一个a、b值&#…

RK3399平台开发系列讲解(I/O篇)Linux最大文件数的限制机制

平台内核版本安卓版本RK3399Linux4.4Android7.1🚀返回专栏总目录 文章目录 一、Linux最大文件数的限制机制1.1、申请fd过程分析1.2、申请file内核对象过程分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在Linux上能打开多少个文件,有两种限制: 第一种:进程级…

十、组件(8)

本章概要 递归组件异步更新队列Teleport 10.11.2 递归组件 组件可以在自己的模板中递归调用自身&#xff0c;但这需要使用 name 选项为组件指定一个内部调用的名称。 当调用 Vue.createApp({}).component({})全局注册组件时&#xff0c;这个全局的 ID 会自动设置为该组件的n…

【云原生】Docker的基本使用方法与优势

&#x1f36c;Docker的基本使用方法和优势&#x1f959;一、简介&#x1f96a;二、优势&#x1f32e;三、基本使用&#x1f959;一、简介 Docker是基于Go语言实现的开源应用容器引擎&#xff0c;通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的应…

配置Mysql与注册登录模块

后端职责可以粗浅的理解为处理各种数据&#xff0c;那么处理数据就可以从下面几个方面考虑&#xff1a; 数据的来源 根据不同的数据来源&#xff0c;我们探究两个方面的内容&#xff1a; 数据的形式 数据的操作 当然&#xff0c;一通操作以后&#xff0c;各个…

操作系统:进程与线程大解析

一文就懂进程与线程一、进程/线程相关概念进程中断并发与并行并发并行线程线程分类多进程和多线程上下文进程上下文进程上下文切换的场景线程上下文扩展&#xff1a;协程线程与协程的区别&#xff1a;协程的优势&#xff1a;二、进程/线程区别与关系进程和线程的区别进程和线程…

【C/C++】你知道位段吗?段位?不,是位段!

本章重点 什么是位段&#xff1f; 位段的内存分配 位段的跨平台问题 位段的应用 上一篇文章我详细介绍了第一种自定义类型--结构体。本章节我们认识一下另外一种自定义类型-- 位段。因为讲解位段时需要用到一点结构体的知识&#xff0c;所以我直接把链接放到这里可按需直接…