Feign【远程调用服务】和zuul【网关】的设计

nacos的使用和微服务调用-feign、zuul 最近在研究微服务以及相关组件,搭建了一个工程研究一下服务注册、服务发现、配置管理、feign调用、zuul网关等。 一、工程结构 nacos-happy作为父工程,引入了绝大多数必要的jar包,例如spring-boot-starter-parent、spring-boot-starter-web、spring-cloud-starter-alibaba-nacos-discovery、spring-cloud-starter-alibaba-nacos-config、spring-cloud-start 阅读详情

目录

项目介绍

整体结构

功能介绍

远程调用

添加远程调用的依赖

yml配置文件内容

设计远程调用接口

业务层注入远程调用对象

启动类添加注解

重要注解

@EnableFeignClients注解

@FeignClient注解

zuul网关设计

添加网关设计依赖

启动类添加注解

yml文件设计


项目介绍

整体结构

功能介绍

  • sp01-commons服务:公有服务,主要定义了用户和商品等对象,以及对应的接口(包含了需要实现的一些方法),还设计了响应请求的一些工具。该服务为其它服务所依赖,所以后续需要使用该服务的工程应当添加此公有服务的依赖。
  • sp02-itemservice服务:商品服务,实现了公有服务的ItemService接口,并定义了控制层用于接收请求。
  • sp03-userservice服务:用户服务,功能与商品服务类似。
  • sp04-orderservice服务:订单服务,实现了订单服务接口,设计了feign远程调用的接口,用于实现远程调用用户服务和商品服务的功能。
  • sp05-eureka服务:注册服务,用于对所有的服务进行注册,可以根据服务的注册列表进行访问相关服务。(设置了两个注册服务,防止服务宕机)
  • sp06-zuul服务:网关服务,为所有的服务添加一个网关,所有的请求经过网关进行转发。

远程调用

添加远程调用的依赖

添加远程服务调用依赖openfeign.

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.tedu</groupId>
    <artifactId>sp04-orderservice</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sp04-orderservice</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.tedu</groupId>
            <artifactId>sp01-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <--添加远程服务调用依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR9</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

</project>

yml配置文件内容

向两个服务注册中心注册了自己的服务。

spring:
  application:
    name: order-service
server:
  port: 8201
# 客户端应用请求地址: /eureka 子路径
# 用浏览器查看 eureka 控制台地址: /
# defaultZone: 如果使用云服务,可以购买不同地点的服务器,自己的服务器则必须是defaultZone
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka

# 配置 Ribbon 重试次数
#ribbon:
#  MaxAutoRetries: 1
#  MaxAutoRetriesNextServer: 2

设计远程调用接口

设计远程服务调用的接口,用于实现远程服务的调用。接口只需定义请求规则,不进行具体的请求处理。下面是远程调用商品服务的接口设计,用户服务的设计类似。

package cn.tedu.sp04.feign;
import cn.tedu.sp01.entity.Item;
import cn.tedu.web.util.JsonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
 * @Author 作者:小龙猿
 * @Project 项目:springcloud1
 * @Time 时间:2021/9/10 14:21
 */
/*
三个配置:
    1.调用哪个服务
    2.调用这个服务的哪个路径
    3.向这个路径提交什么参数
 */
@FeignClient(name = "item-service")
public interface ItemClient {
    @GetMapping("/{orderId}")
    JsonResult<List<Item>> getItem(@PathVariable String orderId);
    @PostMapping("/decreaseNumber")
    JsonResult decreaseNumber(@RequestBody List<Item> items);
}

业务层注入远程调用对象

有了远程服务调用的接口,就可以在业务层注入相关对象,进行远程服务的调用。

package cn.tedu.sp04.order.service;
import cn.tedu.sp01.entity.Item;
import cn.tedu.sp01.entity.Order;
import cn.tedu.sp01.entity.User;
import cn.tedu.sp01.service.OrderService;
import cn.tedu.sp04.feign.ItemClient;
import cn.tedu.sp04.feign.UserClient;
import cn.tedu.web.util.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @Author 作者:小龙猿
 * @Project 项目:springcloud1
 * @Time 时间:2021/9/9 15:41
 */
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
    @Autowired
    private UserClient userClient;//注入远程调用服务的对象(代理对象)
    @Autowired
    private ItemClient itemClient;
    @Override
    public Order getOrder(String orderId) {

        //TODO: 远程调用user-service获取用户信息
        JsonResult<User> user = userClient.getUser(8);//这儿是自己设定的值,真实项目中应该根据登录的用户id查询
//浏览器-->OrderController-->OrderServiceImpl-->ItemClient-->ItemController-->ItemServiceImpl
        //TODO: 远程调用item-service获取商品信息
        JsonResult<List<Item>> items = itemClient.getItem(orderId);
        Order order = new Order();
        order.setId(orderId);
        order.setUser(user.getData());
        order.setItems(items.getData());
        return order;
    }

    @Override
    public void addOrder(Order order) {
        //TODO: 调用item-service减少商品库存
        itemClient.decreaseNumber(order.getItems());
        //TODO: 调用user-service增加用户积分
        userClient.addScore(order.getUser().getId(), 100);
        log.info("保存订单: "+order);
    }
}

启动类添加注解

启动类添加 @EnableFeignClients 注解。

package cn.tedu.sp04;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients
@SpringBootApplication
public class Sp04OrderserviceApplication {
    public static void main(String[] args) {
        SpringApplication.run(Sp04OrderserviceApplication.class, args);
    }
}

重要注解

@EnableFeignClients注解

@EnableFeignClients注解描述启动类时,用于告诉springboot在启动时,扫描启动类所在包或子包中的类,假如接口上有@FeignClient注解描述,则对这样的接口创建其实现类,在实现类内部帮我们进行远程服务调用。

@FeignClient注解

@FeignClient注解用于描述远程调用接口,这个接口不需要你写实现类,你只需要定义访问规则即可(例如请求方式,请求URL,请求参数)。
@FeignClient 注解描述的接口的实现类对象会默认交给spring管理,这个bean对象的名字默认就是name属性指定的值,这个name还有一个层面的含义,就是你远程调用的服务名。
假如@FeignClient注解中添加了contextId属性,则这个属性值默认会作为当前bean对象的名字,此时name的值仅仅作为要调用的服务名对待,一般推荐contextId的值默认为@FeignClient注解描述的接口的名字(首字母小写)。

zuul网关设计

添加网关设计依赖

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.tedu</groupId>
    <artifactId>sp06-zuul</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sp06-zuul</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <--添加网关设计的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.tedu</groupId>
            <artifactId>sp01-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </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>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

启动类添加注解

在启动类上添加两个注解@EnableZuulProxy和@EnableDiscoveryClient。

package cn.tedu.sp06;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@EnableDiscoveryClient//Eureka注册中心扫描该服务并进行注册
@SpringBootApplication
public class Sp06ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(Sp06ZuulApplication.class, args);
    }
}

yml文件设计

主要进行网关路由的设计。

spring:
  application:
    name: zuul
server:
  port: 3001
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
zuul:
  routes:
    item-service: /item-service/**
    user-service: /user-service/**
    order-service: /order-service/**

可以结合下篇文章加深理解 Nacos-消费者服务调用生产者服务(负载均衡实现调用多个服务器)

 

微服务入门(Nacos,Feign,网关Zuul) 日志级别尽量用basic使用HttpClient或OKHttp代替URLConnection引入feign-httpClient依赖配置文件开启httpClient功能,设置连接池参数。 阅读详情

相关推荐

springCloud框架搭建,添加feign和Zuul

6.Feign远程调用工具 接着上一篇搭建springCloud框架,Feign作为springCloud框架中的一个组件,而不是一个服务。添加位置:服务消费方。 6.1 首先添加依赖:(pom工程,版本在父工程中已经设置。) <dependency> <groupId>org.springframework.cloud</groupId> ...

zzjhf的博客 781

SpringColud——Feign(服务调用)& 网关(Zuul)

SpringColud——Feign(服务调用)& 网关(Zuul)

程序员阿龙的博客 2353

SpringCloud外网部署整合之旅(4)------ZUUL服务网关,整合swagger,feign服务调用

有了注册中心,配置中心,业务服务,那么我们要用一个统一入口来访问他 首先建立一个子模块并加入依赖 &lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt; &lt;artifactId&gt;spring-cloud-starter-config&lt;/artifactId&gt; ...

jiulanhao的博客 2183

SpringCloud(6):Feign与Zuul详解

继续Hystrix,这里将学习SpringCloud的最后两部分内容,Feign和Zuul,学完之后就准备做个完整的基于SpringCloud的商城项目了。

成都往右的博客 5812

Feign 独立使用(不用注册中心,要用其他服务)

说明:两种方式,演示 (1) 同一个interface中调用多个服务的接口(RequestLine) (2)同一个interface调用一个服务的接口(ReqMapping) 一 、准备 <!-- Feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactI..

蔡定努 9998

Spring Cloud微服务网上商城毕业设计实战包:含可运行源码、论文、PPT、部署教程与演示视频

一套开箱即用的Spring Cloud电商系统学习资源,完整覆盖毕业设计全流程。Java源码基于Spring Boot + Spring Cloud构建,包含Eureka服务注册中心、商品管理、订单处理、用户权限控制等核心微服务模块,支持前后端分离部署,普通电脑即可本地运行调试。配套文档齐全:毕业论文详述需求分析、系统架构设计(B/S分层结构)、数据库ER图与建表脚本、编码实现逻辑及功能测试过程;答辩PPT分章节讲解技术选型、模块设计与系统演示;MP4操作视频直观展示前台浏览下单、后台商品与订单管理全流程;

m2n3b4v5c6的博客 205

Spring Cloud 入门(二)Zuul 服务网关、Ribbon 负载均衡、Feign 声明式接口调用

文章目录一、Zuul 服务网关 一、Zuul 服务网关     可以看到,如果没有服务网关,比如说有 4 个微服务,客户端就要知道每个微服务的 IP 地址和端口号;而如果有了网关,只需要和网关进行交互,这样可以减少客户端 和 微服务的交互次数,降低耦合性。由网关映射到各个微服务,相当于有一个 统一的访问入口,它会对请求进行 统一管理,比如说,验证身份这种操作也可以放到网关里。      Spring Cloud 集成了 Zuu

weixin_41750142的博客 1737

Spring Cloud微服务架构设计:Eureka集群与Zuul、Feign整合实践

通过实现ZuulFilter接口,我们可以创建自定义过滤器。下面是一个示例,它在请求发送到服务之前添加了请求头信息。@Override@OverrideFeign提供了丰富的自定义接口来满足不同的需求,例如自定义编码器、解码器、日志记录器等。下面是一个简单的自定义解码器的示例:@Override// 自定义解码逻辑// ...在应用Feign时,可以通过配置文件或者编程的方式,指定自定义的组件:@Bean。

weixin_42298254的博客 1065

SpringCloud核心组件

Eureka在设计时就优先保证可用性。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

weixin_57763462的博客 1043

spring cloud 示例源码,Eureka,Zuul,FeignClient用法示例

spring cloud 示例源码,Eureka,Zuul,FeignClient用法示例,版本 <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.3.5.RELEASE</version>

SpringCloud Eureka+config+zuul+feign+hystrix

config使用本地配置,eureka解决服务发现zuul处理路由feign做微服务之间的通讯 hystrix解决快速失败反馈

springcloud

守望程序的双眼 分布式系统的CAP定理 一致性,高可用性,分区容错性(导致CA选一) 先AP,再CP,最后CA 分布式部署 1.部署在不同机器上的不同服务。基于SOA面向服务编程的微服务架构 2.将相同应用复制到不同机器上,集群部署,不属于SOA 微服务架构 1.拼图,粒度小,高内聚低耦合。 2.对用户大量的请求的处理,实例化细分每个功能将其封装成为一个独立的微服务(子系统) springclou...

250

feign-zuul-demo

包含服务注册发现,声明式调用以及网关服务的示例。

微服务中 Feign调用以及网关Zuul的请求头相关问题

微服务中 Feign调用以及网关Zuul的请求头与字段相关问题 文章目录微服务中 Feign调用以及网关Zuul的请求头与字段相关问题前言1. Feign远程调用请求头丢失1.1 原因分析1.2 解决方案11.3 解决方案22. Zuul对请求头的加工 前言 在Spring Cloud中使用Feign进行远端调用时,会发生请求头信息的丢失,下游服务无法获取到上游服务请求头的问题。在搭配Zuul网关后,可能会需要使用前置过滤器对上游服务的请求头信息进行修改、添加或过滤 再转至下游服务。 1. Feign远程

TheJam的博客 1976

3D缺陷检测实战:从点云处理到工业质检优化

本文深入探讨了3D缺陷检测在工业质检中的实战应用,详细阐述了从点云处理到深度学习模型部署的完整技术链路。文章通过PCB焊点检测等实际案例,分析了3D视觉相比2D检测在识别深度、形状等缺陷方面的优势,并分享了点云滤波、分割、特征提取以及利用YOLOv5等模型进行高效检测的优化心得与落地挑战。

weixin_28358083的博客 338

企业微信消息推送API实战:5步搞定可信IP与域名配置(含Python代码示例)

本文详细解析了企业微信消息推送API实战中的关键配置步骤,特别是可信IP与可信域名的配置流程。通过5个清晰步骤,结合Python代码示例,指导开发者快速完成安全通信链路搭建,避免常见错误,确保消息推送服务稳定可靠。

qsc9012345的博客 996

Hystix熔断、Feign以及ZUUL网关(学习总结)

Hystix熔断、Feign以及ZUUL网关 Hystix(熔断器) Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。 熔断器是容错管理工具,作用是通过隔离、控制服务从而对延迟 和故障提供更强大的的容错能力,避免拖垮整个系统。 复杂分布式架构通常都具有很多依赖,当一个应用高度耦合其他服务时非常危险且容易导致失败,这种...

Ruyi_squad的博客 1192

SpringDoc 基本使用指南

SpringDoc 凭借零配置启动注解简洁和深度兼容 Spring 生态的优势,已成为 Spring Boot API 文档的首选工具。自动化- 减少手动维护文档的成本;标准化- 严格遵循 OpenAPI 3 规范;可扩展- 分组、安全控制灵活适配复杂项目。访问即可查看交互式文档(默认路径)

墨鸦的博客 1万+

Zuul 实现服务网关路由

Zuul 实现服务网关路由项目演示

小凯的博客 1261

Docker小白也能搞定!5分钟用calibre-web搭建私人Kindle书库(附静读天下配置)

本文为零基础用户提供了一份详尽的指南,介绍如何利用Docker容器技术,在5分钟内快速部署Calibre-Web服务,从而搭建一个完全私有的个人Kindle书库。教程涵盖了从Docker安装、Calibre-Web一键部署、书籍元数据管理到移动端配置的全流程,并重点讲解了如何与安卓端知名阅读应用“静读天下”联动,实现跨设备无缝访问,打造媲美在线书城的个性化阅读体验。

weixin_29216957的博客 542

【MATLAB-app】系列教程(含视频)第4、5、6课:实战_制作简单的图像处理软件

写作时间: 2020-12-27 我的教程目录 第1课:初步了解appdesigner 第2课:学会制作一个计算器 第3课:学习更多的控件(重点!) 第4课:实例1:制作一个图像处理软件 第5课:学习APPdesigner的设计精髓,框架 第6课:结合使用多种控件,函数等,丰富我们的实例1 第7课:app设计打包,完成工程应用导出 标题: 第4课:我的实例_学会制作一个图像处理软件 本文目录: 1.先看看我之前的一个工程 2.常用的基本组件控件 3.最常用且实用的控件的用法 -3.1 editfilel

wind 4054

SpringCloud_Feign和Zuul

在之前我们进行远程服务调用是使用的Spring提供的RestTemplate进行调用,虽然也完成了功能,但是写法是非常不优雅的,还需要进行拼接字符串来进行参数传递。为了解决这个问题,引入SrpingCloud的组件Feign。 Feign简介: Feign可以把Rest请求进行伪装,伪装成类似于SpringMVC的Controller一样。你不用再自己去拼接url、拼接参数等操作,一切都交给Fei...

qq_44193036的博客 691

SQL Server数据库备份与恢复

在 SQL Server 中,数据库备份与恢复是保障数据安全的核心操作。

zjw541806的博客 1876

Spring Cloud 之 Eureka集群整合Zuul、Feign

简介 Eureka是Spring Cloud Netflix微服务套件中的一部分,提供了服务治理的功能。Eureka集群中的节点基于REST服务进行通信,如使用HttpClient与RestTemplate,Spring Cloud 套件中的Feign模块提供了更为简洁的服务访问。 Zuul是一个网关,能够将集群的服务隐藏到网关后面,统一对外提供服务,功能上类似Ngi...

二十同学 7万+

Centos7 yum 报错「Errno 256」No more mirrors to try 解决方法

首先该问题的出现是由于网络的震荡导致,这是重点。(1)将源更换成阿里云的官方源,步骤参考如上(2)同时将zabbix的官方源更换成阿里云里面的zabbix镜像源,因为zabbix官方源根本网络不通,因为国家防火墙的拦截,导致网络不通。这是阿里源的zabbix镜像地址: https://mirrors.aliyun.com/zabbix/zabbix/4.4/rhel/7/修改系统中早期生成的zabbix.repo文件,如下:主要是把baseurl替换成阿里云的zabbix镜像地址即可。

专注基础架构领域 3875

VCAST创建单元测试工程

选择工作目录,后面创建胡UT工程将会生成到这个目录。

qq_42851449的博客 2483
上一篇: Autowired注解与Resource注解的区别
下一篇: 三大工厂模式之简单工厂模式
不平衡的叉叉树
博客等级 码龄7年 5833粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值