当前位置: 首页 > news >正文

OpenFeign学习

系列文章目录

JavaSE
基础知识、数据类型学习万年历项目代码逻辑训练习题
代码逻辑训练习题方法、数组学习图书管理系统项目
面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习
集合学习IO流、多线程学习仓库管理系统JavaSE项目
员工管理系统、多表查询、反射实现DBHelper学习DML、DDL、数据库对象学习
JavaWeb
网络编程、各种标签、CSS学习ECMAScript、BOM学习DOM、jQuery学习
Servlet、JSP、Cookie、Ajax学习融资管理系统JavaWeb项目
框架
MyBatis框架学习逆向工程、Spring框架IOC、AOP学习SpringMVC框架学习
SpringBoot框架学习招聘网站框架项目Vue介绍、窗体内操作、窗体间操作学习
Vue路由配置、网络请求访问框架项目、element组件介绍学习标准管理系统Vue项目
微服务
Linux安装、Nginx反向代理、负载均衡学习Docker学习Jenkins学习
Nexus学习Spring Security学习RabbitMQ学习
Redis学习MongoDB学习MongoDB学习
Nacos学习Spring Session学习Spring Gateway学习
JSR 303学习OpenFeign学习

文章目录

  • 系列文章目录
  • 前言
  • 一、OpenFeign介绍
    • 1. Feign框架介绍
    • 2. OpenFeign框架
    • 3. Feign与OpenFeign的区别
  • 二、代码实现
    • 1. 开启nacos和redis
    • 2. 创建Score实体类(两个项目共同改动)
    • 3. 创建UserDto实体类(两个项目共同改动)
    • 4. 添加IUserService接口
      • 4.1 demo-session-01改动
      • 4.2 demo-session-02改动
    • 5. 添加UserServiceImpl接口实现类(两个项目共分别改动)
      • 5.1 demo-session-01改动
      • 5.2 demo-session-02改动
    • 6. 创建ResultCode枚举类(两个项目共同改动)
    • 7. 创建Result工具类(两个项目共同改动)
    • 8. 更新UserController/ScoreController类
      • 8.1 demo-session-01改动
      • 8.2 demo-session-02改动
    • 9. 更改配置文件
      • 9.1 demo-session-01改动
      • 9.2 demo-session-02改动
    • 10. 运行项目,访问链接
  • 三、实现http请求管理
    • 1. 添加openfeign依赖
    • 2. 创建ScoreFeign接口(demo-session-01改动)
    • 3. 更新UserServiceImpl文件(demo-session-01改动)
    • 4. 更新SpringBootMain启动类(demo-session-01改动)
    • 5. 启动项目
  • 四、添加请求头
    • 1. 更新UserController类(demo-session-01改动)
    • 2. 更新ScoreController类(demo-session-02改动)
    • 3. 启动项目、启动postman发送请求
    • 4. 创建RequestHeaderInterceptor拦截器(demo-session-01改动)
    • 5. 重新启动demo-session-01项目、postman发送请求
  • 四、参数传递
    • 1. 更新ScoreFeign接口(demo-session-01改动)
    • 2. 更新IUserService接口(demo-session-01改动)
    • 3. 更新UserServiceImpl实现类(demo-session-01改动)
    • 4. 更新UserController类(demo-session-01改动)
    • 5. 更新ScoreController类(demo-session-02改动)
    • 6. 启动项目、postman发送请求
  • 总结


前言

本文我们要讲述:
OpenFeign
在下攸攸太上,今天依旧帅气。


一、OpenFeign介绍

1. Feign框架介绍

Feign是一个用于处理HTTP请求的框架,集成了负载均衡、熔断机制和HTTP请求管理等功能,旨在进行微服务通信。
负载均衡:帮助降低服务器的压力,确保各个服务器承担的压力相对均衡。
熔断机制:用于处理微服务之间的通信,防止由于某一服务宕机导致长时间等待响应的情况。
HTTP请求管理:用于实现微服务间的HTTP通信。

2. OpenFeign框架

OpenFeign是SpringCloud下的一个框架,用于微服务通信,采用RESTful风格进行服务间通信。
OpenFeign基于Feign框架,但在Spring环境下进行了二次升级,天然支持Spring的思想和注解,使得开发变得更加简单。

3. Feign与OpenFeign的区别

Feign对HTTP进行了封装,实现微服务通信;而OpenFeign是在Spring环境下对Feign进行的二次升级,使得框架更加简单、更贴近Spring,减少了开发者在使用时的障碍。

二、代码实现

此项目在SpringSession项目基础上编写,此网盘链接内有已完成的项目
通过网盘分享的文件:SpringSession——OpenFeign.zip
链接: https://pan.baidu.com/s/1-XC15nXgLlSZiumph1aqFw?pwd=u8y1 提取码: u8y1

1. 开启nacos和redis

docker start nacos
docker start redis-6379

在这里插入图片描述

2. 创建Score实体类(两个项目共同改动)

package com.jjy.entry;import lombok.Data;@Data
public class Score {private String name;private Double score;
}

3. 创建UserDto实体类(两个项目共同改动)

import lombok.Data;import java.util.List;@Data
public class UserDto {private String id;private String name;private String password;private List<Score> scoreList;
}

4. 添加IUserService接口

4.1 demo-session-01改动

package com.jjy.service;import com.jjy.entry.UserDto;public interface IUserService {public UserDto info();
}

4.2 demo-session-02改动

package com.jjy.service;import com.jjy.entry.Score;import java.util.List;public interface IScoreService {public List<Score> info();
}

5. 添加UserServiceImpl接口实现类(两个项目共分别改动)

5.1 demo-session-01改动

package com.jjy.service.impl;import com.jjy.entry.UserDto;
import com.jjy.service.IUserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements IUserService {@Overridepublic UserDto info() {return new UserDto();}
}

5.2 demo-session-02改动

package com.jjy.service.impl;import com.jjy.entry.Score;
import com.jjy.service.IScoreService;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;@Service
public class ScoreServiceImpl implements IScoreService {@Overridepublic List<Score> info() {List<Score> result = new ArrayList<>();for (int i=0;i<3;i++){Score score=new Score();score.setName("name"+i);score.setScore(Math.random()*10);result.add(score);}return result;}
}

6. 创建ResultCode枚举类(两个项目共同改动)

package com.jjy.util;public enum ResultCode {SUCCESS(0, "请求成功"),ERROR(1, "请求失败"),;private int code;private String message;ResultCode(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}
}

7. 创建Result工具类(两个项目共同改动)

package com.jjy.util;import lombok.Data;import java.util.HashMap;
import java.util.Map;@Data
public class Result {private Integer code;private String message;private Map<String, Object> map = new HashMap<>();private Result() {}public static Result ok() {Result r = new Result();r.setCode(ResultCode.SUCCESS.getCode());r.setMessage(ResultCode.SUCCESS.getMessage());return r;}public static Result error() {Result r = new Result();r.setCode(ResultCode.ERROR.getCode());r.setMessage(ResultCode.ERROR.getMessage());return r;}public Result put(String key, Object value) {map.put(key, value);return this;}public Object get(String key) {return map.get(key);}
}

8. 更新UserController/ScoreController类

8.1 demo-session-01改动

package com.jjy.controller;import com.jjy.entry.UserDto;
import com.jjy.service.IUserService;
import com.jjy.util.Result;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;@RestController
@RequestMapping("/user")
@Setter
public class UserController {@Autowiredprivate IUserService userService;@GetMappingpublic Result info(){UserDto userDto=userService.info();return Result.ok().put("data",userDto);}
}

8.2 demo-session-02改动

删除UserController类

package com.jjy.controller;import com.jjy.entry.Score;
import com.jjy.service.IScoreService;
import com.jjy.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/score")
public class ScoreController {@Autowiredprivate IScoreService scoreService;@GetMapping("/info")public Result info(){List<Score> list=scoreService.info();return Result.ok().put("list",list);}
}

9. 更改配置文件

9.1 demo-session-01改动

spring.application.name=openfeignDemo1

9.2 demo-session-02改动

spring.application.name=openfeignDemo2

10. 运行项目,访问链接

http://127.0.0.1:100/user
在这里插入图片描述
http://127.0.0.1:200/score/info
在这里插入图片描述
在这里插入图片描述

三、实现http请求管理

1. 添加openfeign依赖

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

2. 创建ScoreFeign接口(demo-session-01改动)

package com.jjy.service;import com.jjy.util.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient("openfeignDemo2")
public interface ScoreFeign {@GetMapping("/score/info")public Result info();
}

3. 更新UserServiceImpl文件(demo-session-01改动)

scoreFeign会爆红,不用管,下一步就不会了,OpenFeign会自动生成ScoreFeign的代理类

package com.jjy.service.impl;import com.jjy.entry.Score;
import com.jjy.entry.UserDto;
import com.jjy.service.IUserService;
import com.jjy.service.ScoreFeign;
import com.jjy.util.Result;
import com.jjy.util.ResultCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserServiceImpl implements IUserService {@Autowiredprivate ScoreFeign scoreFeign;@Overridepublic UserDto info() {UserDto userDto=new UserDto();userDto.setId("10");userDto.setName("zhangsan");userDto.setPassword("123456");Result result=scoreFeign.info();if(result.getCode() == ResultCode.SUCCESS.getCode()){userDto.setScoreList((List<Score>) result.get("list"));}return userDto;}
}

4. 更新SpringBootMain启动类(demo-session-01改动)

@EnableFeignClients  //开始OPenFeign

在这里插入图片描述

5. 启动项目

demo-session-01项目:查看用户数据的同时,也可以获得demo-session-02的数据
在这里插入图片描述
demo-session-02项目不变
在这里插入图片描述
在这里插入图片描述

四、添加请求头

1. 更新UserController类(demo-session-01改动)

package com.jjy.controller;import com.jjy.entry.UserDto;
import com.jjy.service.IUserService;
import com.jjy.util.Result;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@RestController
@RequestMapping("/user")
@Setter
public class UserController {@Autowiredprivate IUserService userService;@GetMappingpublic Result info(HttpServletRequest request){ // 添加参数// 更新部分String test = request.getHeader("test");System.out.println("User项目header:"+test);// 更新部分UserDto userDto=userService.info();return Result.ok().put("data",userDto);}}

2. 更新ScoreController类(demo-session-02改动)

package com.jjy.controller;import com.jjy.entry.Score;
import com.jjy.service.IScoreService;
import com.jjy.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.util.List;@RestController
@RequestMapping("/score")
public class ScoreController {@Autowiredprivate IScoreService scoreService;@GetMapping("/info")public Result info(HttpServletRequest request){ // 添加参数// 更新部分String test = request.getHeader("test");System.out.println("Score项目header:"+test);// 更新部分List<Score> list=scoreService.info();return Result.ok().put("list",list);}
}

3. 启动项目、启动postman发送请求

按照如下步骤发送请求
在这里插入图片描述
可以看到User项目的header接收到了信息,Score项目header没接收到
在这里插入图片描述

4. 创建RequestHeaderInterceptor拦截器(demo-session-01改动)

package com.jjy.interceptor;import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;@Configuration
public class RequestHeaderInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();if (requestAttributes == null) {return;}HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();String test = request.getHeader("test");template.header("test", test);}
}

5. 重新启动demo-session-01项目、postman发送请求

在这里插入图片描述

四、参数传递

1. 更新ScoreFeign接口(demo-session-01改动)

添加如下两个方法:

    @GetMapping("/score/{id}")Result id(@PathVariable String id);@PostMapping("/score/add")Result add(@RequestBody UserDto user);

2. 更新IUserService接口(demo-session-01改动)

添加如下两个方法:

    UserDto add(UserDto user);UserDto id(String id);

在这里插入图片描述

3. 更新UserServiceImpl实现类(demo-session-01改动)

    @Overridepublic UserDto add(UserDto user) {UserDto userDto = new UserDto();Result result = scoreFeign.add(user);if(result.getCode() == ResultCode.SUCCESS.getCode()){UserDto resultUser = JSON.parseObject(JSON.toJSONString(result.get("data")),UserDto.class);BeanUtils.copyProperties(resultUser, userDto);}return userDto;}@Overridepublic UserDto id(String id) {UserDto userDto = new UserDto();Result result = scoreFeign.id(id);if(result.getCode() == ResultCode.SUCCESS.getCode()){userDto.setId((String) result.get("id"));}return userDto;}

4. 更新UserController类(demo-session-01改动)

添加如下两个方法:

    @GetMapping("/{id}")public Result id(@PathVariable String id) {  //url传值UserDto userDto = userService.id(id);return Result.ok().put("data", userDto);}@PostMapping("/add")public Result add(@RequestBody UserDto user) { //对象传值return Result.ok().put("userDto", user);}

5. 更新ScoreController类(demo-session-02改动)

添加如下两个方法:

    @GetMapping("/{id}")public Result id(@PathVariable String id) {return Result.ok().put("id", id);}@PostMapping("/add")public Result add(@RequestBody UserDto user) {return Result.ok().put("userDto", user);}

6. 启动项目、postman发送请求

测试ID方法:
在这里插入图片描述
测试ADD方法:
在这里插入图片描述


总结

本文讲述了:
OpenFeign:能够处理Http请求
通过网盘分享的文件:SpringSession——OpenFeign.zip
链接: https://pan.baidu.com/s/1-XC15nXgLlSZiumph1aqFw?pwd=u8y1 提取码: u8y1
在下攸攸太上,正在留长发。


http://www.mrgr.cn/news/39281.html

相关文章:

  • 4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
  • 双指针---(部分地更新)
  • next 从入门到精通
  • 项目集成SpringSecurity框架
  • YAPF,一个超强大的Python库
  • ​一篇关于BootRom的概念性文章。
  • 王道-操作系统
  • 内存泄漏和内存溢出简述
  • 基于单片机的可调式中文电子日历系统
  • STM32+ADC+扫描模式
  • 技术速递|Python in Visual Studio Code 2024年9月发布
  • 数仓建模:DataX同步Mysql数据到Hive如何批量生成建表语句?| 基于SQL实现
  • 二分查找详解(Java版)
  • 【Linux】Docker下载与使用-nginx
  • 【在Linux世界中追寻伟大的One Piece】命名管道
  • 基于springboot+小程序的儿童预防接种预约管理系统(疫苗1)(源码+sql脚本+视频导入教程+文档)
  • 使用USB Network Gate借用远程USB设备
  • .lcrypt勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • 5个你一定要知道的Word使用小技巧
  • 【D3.js in Action 3 精译_025】3.4 让 D3 数据适应屏幕(中)—— 线性比例尺的用法