【Spring Cloud】远程调用

目录

  • Spring Cloud Netflix Feign简介
    • 前言
    • Feign是什么
    • OpenFeign组件和Spring Cloud OpenFeign
      • OpenFeign组件
      • Spring Cloud OpenFeign
  • OpenFeign-微服务接口调用
    • 需求说明
    • 1. 启动Eureka Server服务
    • 2.创建两个项目,将其注册到Eureka Server
    • 3.在服务提供者中添加业务处理代码
      • 3.1在demo-user-provider 中添加UserService接口,提供checkuser()方法
      • 3.2在demo-user-provider 中添加UserServiceImpl类,实现接口中的方法
      • 3.3在demo-user-provider 中添加UserController类
      • 3.4启动demo-user-provider,测试是否成功
    • 4.在服务消费者中调用服务提供者的接口
      • 4.1在demo-user-consumer中添加OpenFeign依赖
      • 4.2在demo-user-consumer中创建UserFeignClient 接口
      • 4.3为接口添加@FeignClient注解并指定name属性值
      • 4.4启动类添加注解@EnableFeignClients
      • 4.5在demo-user-consumer中创建LocalUserService接口,定义login()方法,并创建实现类LocalUserServiceImpl。
      • 4.6在demo-user-consumer中创建UserController类。
    • 5.测试是否成功
  • OpenFeign-接口调用传递参数
    • 1.修改提供服务方法
      • 1.1demo-user-provider的checkUser()方法,添加参数
      • 1.2UserController中的请求处理
    • 2.在服务消费者中传递参数
    • 3.修改调用服务方法
    • 小结:OpenFeign-接口调用传递参数

Spring Cloud Netflix Feign简介

前言

  • 一个成熟的微服务解决方案,内部调用必然依赖一个好的RPC框架,比如:基于Http协议的Feign,基于TCP协议的Dubbo。
  • 如果不使用RPC框架,那么调用服务需要走Http的话,配置请求head、body,然后才能发起请求。获得响应体后,还需解析等操作,十分繁琐。

Feign是什么

  • Feign是Spring Cloud组件中一个轻量级RESTful的Http服务客户端,以Java接口注解的方式调用Http请求。
  • Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,封装了Http调用流程。
  • Feign内置了Ribbon,可以与Eureka组合使用以支持负载均衡。用来做客户端负载均衡,去调用服务注册中心的服务。
  • Feign是一个声明式、模板化的HTTP客户端,它让微服务之间的调用变得更简单了。

OpenFeign组件和Spring Cloud OpenFeign

OpenFeign组件

  • 由于 Netflix 公司不再维护Feign组件,Feign组件由社区维护,Feign更名为 OpenFeign,并且项目迁移到新的仓库。

Spring Cloud OpenFeign

  • Spring Cloud OpenFeign是在Spring Cloud Feign组件的基础上进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。
  • Spring Cloud OpenFeign的@FeigenClient注解可以解析SpringMvc的@RequestMapping注解下的接口,通过动态代理的方式产生实现类,在实现类中进行负载均衡的微服务远程调用!
  • 咱们把注册中心中每一个服务都以一个接口的形式体现,我们服务的消费者只需要调用这个接口中的方法,配合Ribbon使用,那么底层就会自动的调用远方的服务。

OpenFeign-微服务接口调用

需求说明

  • 启动两个微服务项目,并将其都注册到需要用户认证的Eureka Server
  • 实现两个微服务间的接口调用(最简单的方法调用,不用传参)。

1. 启动Eureka Server服务

2.创建两个项目,将其注册到Eureka Server

  • 项目一: demo-user-consumer
  • 项目二: demo-user-provider

3.在服务提供者中添加业务处理代码

3.1在demo-user-provider 中添加UserService接口,提供checkuser()方法

public interface UserService {
    boolean checkUser() throws Exception;
}

3.2在demo-user-provider 中添加UserServiceImpl类,实现接口中的方法

@Service
public class UserServiceImpl implements UserService {
    @Override
    public boolean checkUser() throws Exception {
        return true;
    }
}

3.3在demo-user-provider 中添加UserController类

@RestController
public class UserController {
    @Resource
    private UserService userService;
    @PostMapping("/provider/checkUser")
    public boolean checkUser() throws Exception{
        return userService.checkUser();
    }
}

3.4启动demo-user-provider,测试是否成功

4.在服务消费者中调用服务提供者的接口

4.1在demo-user-consumer中添加OpenFeign依赖

        <!--OpenFeign组件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

4.2在demo-user-consumer中创建UserFeignClient 接口

4.3为接口添加@FeignClient注解并指定name属性值

//通过name属性指定访问注册中心的服务提供者的名字
@FeignClient(name = "DEMO-USER-PROVIDER")
public interface UserFeignClient {
    /**
     * 远程调用DEMO-USER-PROVIDER中的/provider/checkUser服务
     * 调用的路径名称必须和服务提供者保证高度一致
     * @return
     * @throws Exception
     */
    @PostMapping("/provider/checkUser")
    boolean checkUser() throws Exception;
}

4.4启动类添加注解@EnableFeignClients

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class DemoUserConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoUserConsumerApplication.class, args);
    }

}

4.5在demo-user-consumer中创建LocalUserService接口,定义login()方法,并创建实现类LocalUserServiceImpl。

public interface LocalUserService {
    boolean doLogin() throws Exception;
}
@Service
public class LocalUserServiceImpl implements LocalUserService {
    @Resource
    private UserFeignClient userFeignClient;
    @Override
    public boolean doLogin() throws Exception {
        //通过http协议调用的服务
        return userFeignClient.checkUser();
    }
}

4.6在demo-user-consumer中创建UserController类。

@RestController
public class UserController {
    @Resource
    private LocalUserService localUserService;
    @PostMapping("/consumer/doLogin")
    public String doLogin() throws Exception{
        boolean result=localUserService.doLogin();
        if(result){
            return "登录成功";
        }else {
            return "登录失败";
        }
    }
}

5.测试是否成功

在这里插入图片描述

OpenFeign-接口调用传递参数

1.修改提供服务方法

1.1demo-user-provider的checkUser()方法,添加参数

public interface UserService {
    boolean checkUser(String phone,String password) throws Exception;
}
@Service
public class UserServiceImpl implements UserService {
    @Override
    public boolean checkUser(String phone,String password) throws Exception {
        return "admin".equals(phone) && "123456".equals(password);
    }
}

1.2UserController中的请求处理

@RestController
public class UserController {
    @Resource
    private UserService userService;
    @PostMapping("/provider/checkUser")
    public boolean checkUser(String phone,String password) throws Exception{
        return userService.checkUser(phone,password);
    }
}

2.在服务消费者中传递参数

修改上个示例中demo-user-consumer的UserFeignClient 接口,和提供服务方法保持一致

//通过name属性指定访问注册中心的服务提供者的名字
@FeignClient(name = "DEMO-USER-PROVIDER")
public interface UserFeignClient {
    /**
     * 远程调用DEMO-USER-PROVIDER中的/provider/checkUser服务
     * 调用的路径名称必须和服务提供者保证高度一致
     * @return
     * @throws Exception
     */
    @PostMapping("/provider/checkUser")
    boolean checkUser(@RequestParam String phone,@RequestParam String password) throws Exception;
}

3.修改调用服务方法

修改上个示例中demo-user-consumer的login()方法,调用服务时传入参数

public interface LocalUserService {
    boolean doLogin(String phone,String password) throws Exception;
}
@Service
public class LocalUserServiceImpl implements LocalUserService {
    @Resource
    private UserFeignClient userFeignClient;
    @Override
    public boolean doLogin(String phone,String password) throws Exception {
        //通过http协议调用的服务
        return userFeignClient.checkUser(phone,password);
    }
}
@RestController
public class UserController {
    @Resource
    private LocalUserService localUserService;
    @PostMapping("/consumer/doLogin")
    public String doLogin(String phone,String password) throws Exception{
        boolean result=localUserService.doLogin(phone,password);
        if(result){
            return "登录成功";
        }else {
            return "登录失败";
        }
    }
}

小结:OpenFeign-接口调用传递参数

  • 单个参数:添加@RequestParam

  • 多个参数:添加@RequestParam

  • Map参数:添加@RequestBody

  • 自定义对象参数:添加@RequestBody

  • 自定义对象参数可以将需要传递的对象抽离到公共组件中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何处理逻辑设计中的时钟域

1.什么是时钟域 2.PLL对时钟域管理 不管是否需要变频变相&#xff0c;在FPGA内部将外部输入时钟从专用时钟引脚扇入后先做PLL处理。如何调用pll&#xff0c;见另一篇文章。 约束输入时钟 creat_clock -period 10 -waveform {0 5} [get_ports {sys_clk}] 3.单bit信号跨时钟…

【Linux进程篇】父子进程fork函数||进程生死轮回状态||僵尸进程与孤儿进程

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;上篇文章中我们认识了进程&#xff0c;可执行程序在内存中加载运行被称作进程&#xff0c;而操作系统是通过给每一个可执行程序创建一个PCB来管理进程的。并且学习了一些查看进程的指令&#xff0c;认识…

Flask 蓝图路由的模块化开发

基于 Flask 蓝图路由的模块化开发 1. 编程目标 为了提高Flask应用的可维护性和可扩展性&#xff0c;我们通过使用Flask的蓝图(Blueprint)功能&#xff0c;可以将不同的功能模块拆分到独立的文件中&#xff0c;方便后续的开发和维护。 2. 项目结构 项目结构树如下&#xff1…

助力企业标准化搭建--图框模板的创建

古有秦皇书同文、车同轨&#xff0c;今各行各业都有国际标准、国家标准&#xff0c;其目的就是为了标准化、统一化&#xff0c;由此可见标准化的重要性&#xff1b;一个企业若是想规范员工的操作&#xff0c;推行标准化也很重要&#xff1b;因此对于需要绘制电气图纸的行业来说…

从0开始学统计-秩和检验

1.什么是秩和检验&#xff1f; 秩和检验&#xff0c;也称为Wilcoxon 秩和检验&#xff0c;是一种非参数统计检验方法&#xff0c;用于比较两个独立样本的中位数是否有显著差异。它不要求数据满足正态分布假设&#xff0c;因此适用于小样本或者数据不满足正态分布假设的情况。 …

2024年怎么下载学浪app视频

想要在2024年紧跟潮流&#xff0c;成为一名优秀的学浪用户吗&#xff1f;今天就让我们一起探索如何下载学浪app视频吧&#xff01; 学浪视频下载工具打包 学浪下载工具打包链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享…

性能怪兽!香橙派 Kunpeng Pro 开发板深度测评,带你解锁无限可能

性能怪兽&#xff01;香橙派 Kunpeng Pro 开发板深度测评&#xff0c;带你解锁无限可能 文章目录 性能怪兽&#xff01;香橙派 Kunpeng Pro 开发板深度测评&#xff0c;带你解锁无限可能一、背景二、香橙派 Kunpeng Pro 硬件规格概述三、使用准备与系统安装1️⃣、系统安装步骤…

字节面试:百亿级数据存储,怎么设计?只是分库分表吗?

尼恩&#xff1a;百亿级数据存储架构起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#xff0c…

cuda 11.6 pytorch安装

在安装之前&#xff0c;需要先配置GPU环境&#xff08;安装CUDA和CudaNN) 命令行输入nvidia-smi&#xff0c;查看驱动信息 nvidia-smi 安装相应的CUDA 和CUDANN 验证&#xff1a;输入nvcc --version 或者nvcc -V 进行检查 nvcc --version nvcc -V 在anaconda里创建环境 con…

彭永东所交“答卷”道尽万般无奈,贝壳找房营收、利润双双锐减

就今年第一季度业绩披露后两日的股价变动来看&#xff0c;贝壳找房&#xff08;下称“贝壳”&#xff09;似乎并未在港股和美股市场取得预期的效果。 港股市场&#xff0c;截至5月24日收盘&#xff0c;贝壳-W&#xff08;HK:02423&#xff09;报收43.9港元/股&#xff0c;当日跌…

海外网红营销新趋势:“快闪式”营销如何迅速提升品牌曝光度

在当今数字化时代&#xff0c;海外网红营销已成为品牌迅速触达全球消费者、提升品牌曝光度和刺激销售的重要手段。其中&#xff0c;“快闪式”营销以其独特的时效性、创意性和互动性&#xff0c;成为品牌与海外网红合作的新趋势。本文Nox聚星将和大家探讨如何利用海外网红的影响…

梭住绿色,植梦WILL来,容声冰箱“节能森林计划”再启航

近日&#xff0c;容声冰箱再度开启了“节能森林计划”绿色公益之旅。 据「TMT星球」了解&#xff0c;此次活动深入到阿拉善荒漠化地带&#xff0c;通过实地考察和亲身体验&#xff0c;见证容声了“节能森林计划”项目的持续落地和实施效果。 2022年&#xff0c;容声冰箱启动了…

5个好用的AI写论文网站推荐

目录 1.AIQuora论文写作 2.passyyds 答辩PPT 3.AIPassgo论文降AIGC 4.文状元 5.passyyds论文写作 毕业论文是每个毕业生的痛&#xff0c;不管你是本科还是硕士要想顺利毕业你就不得不面对论文。然而&#xff0c;面对论文写作时常常感到无从下手&#xff1a;有时缺乏灵感&a…

微信小程序毕业设计-跑腿系统项目开发实战(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

ChAMP加载肺癌数据和分析甲基化数据流程

ChAMP加载肺癌数据和分析甲基化数据流程 1. 加载数据分析 #!/bin/evn R rm(list = ls()) library(rstudioapi) current_script_path <- getActiveDocumentContext()$path# 将路径转换为当前目录 current_directory <- dirname(current_script_path)# 设置当前工作目录 …

【数据结构】红黑树——领略天才的想法

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 二叉搜索树 AVL树 红黑树概述 性质详解 效率对比 旋转操作 元素操作 代码实现 二叉搜索树 【数据结构】二叉搜索树-CSDN博客 AVL树 【数据结构】AVL树——平衡二叉搜索…

摸鱼大数据——Hive表操作——基本操作

Hive表操作 Hive乱码解决 1、乱码现象 create database test1 comment "乱码测试"; use test1; CREATE TABLE orders ( orderId bigint COMMENT 订单id, orderNo string COMMENT 订单编号, shopId bigint COMMENT 门店id ); 2、处理步骤 注意&#…

uniapp页面vue3下拉触底发送获取新数据请求实现分页功能

页面下拉触底获取新数据实现分页功能实现方式有两种&#xff0c;根据自己的业务需求来定&#xff0c;不同的方案适用场景不一样&#xff0c;有的是一整个页面下拉获取新数据&#xff0c;有的是部分盒子内容滚动到底部时候实现获取新数据&#xff0c;下面讨论一下两种方式的区别…

是他将计算机从“一屋子”变成“一柜子”——量子前哨缅怀小型机之父 戈登·贝尔

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;6000字丨15分钟阅读 5 月 21 日&#xff0c; 美国贝尔实验室资深人士 John Mashey 发布消息称&#xff0c;计算机先驱戈登贝尔&#xff08;Gordon…

精通C++ STL(二):string类的模拟实现

目录 string类各函数接口总览 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载函数 析构函数 迭代器相关函数 begin和end 容量和大小相关函数 size和capacity reserve和resize empty 修改字符串相关函数 push_back append operator insert erase clear swap c_str 访…