OpenFeign微服务部署
一.开启nacos 和redis
1.查看nacos和redis是否启动
docker ps

2.查看是否安装nacos和redis
docker ps -a

3.启动nacos和redis
docker start nacos
docker start redis-6379
docker ps

二.使用SpringSession共享例子
这里的两个例子在我的一个博客有创建过程,我就不再创建了。
SpringSession微服务-CSDN博客
对两个共享做出一点修改
1.对springsessiondemo做修改
2.1.1.添加实体类 Score

package com.jr.entry;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;@Component
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Score {private String name;private Double score;
}

2.1.2添加实体类 UserDto
package com.jr.entry;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@Component
@Data
public class UserDto {private String id;private String name;private String password;private List<Score> scoreList;
}

2.1 3.添加接口 IUserService

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

4.添加接口实现类 UserServiceImpl

package com.jr.service.impl;import com.jr.entry.UserDto;
import com.jr.service.IUserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements IUserService {@Overridepublic UserDto info() {return new UserDto();}
}
5添加 UserController 类
package com.jr.controller;import com.jr.entry.UserDto;
import com.jr.service.IUserService;
import com.jr.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;@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate IUserService userService;@GetMappingpublic Result info(){UserDto userDto=userService.info();return Result.ok().put("data",userDto);}
}
6.添加枚举 ResultCode(为了更规范化)

package com.jr.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.jr.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.修改application.properties文件中,项目注册名字:
spring.application.name=openfeignDemo1

spring.application.name=openfeignDemo1
2.对sessiondemo1做改动
1.添加实体类 Score
package com.jr.entry;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;@Component
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Score {private String name;private Double score;
}
2.2.添加实体类 UserDto
package com.jr.entry;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@Component
@Data
public class UserDto {private String id;private String name;private String password;private List<Score> scoreList;
}
3.添加接口 IScoreService
package com.jr.service;import com.jr.entry.Score;import java.util.List;public interface IScoreService {public List<Score> info();
}
4.添加接口实现类 ScoreServiceImpl
package com.jr.service.impl;import com.jr.entry.Score;
import com.jr.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;}
}
5.添加 ScoreController类
@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);}
}
6.添加枚举 ResultCode
package com.jr.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.jr.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.8.修改application.properties文件中,项目注册名字:
spring.application.name=openfeignDemo2

spring.application.name=openfeignDemo2
三.启动两个项目(同时)
如果遇到socket closed问题,可能是哪个项目端口冲突了,改了就行
1.第一个项目

2.第二个项目

nacos网站里
四.实现http请求管理
我们想要在第一个项目里面查询用户信息的同时也能访问第二个项目的成绩集合。
1.两个项目都向pom.xml添加依赖
<!-- feign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
2.2.在 “用户项目” 里(第一个项目),添加一个接口
定义了Feign接口,接口中的方法和对应服务端Controller方法一样,两点不同
RequestMapping注解的值要求全路径,包括controller上和方法上的注解地址拼接到一起
添加FeignClient注解,参数是服务端微服务的名称
package com.jr.feign;import com.jr.util.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
@Component
@FeignClient("openfeignDemo2")
public interface ScoreFeign {@GetMapping("/score/info")public Result info();}
3.改动UserServiceImpl实现类
package com.jr.service.impl;import com.jr.entry.Score;
import com.jr.entry.UserDto;
import com.jr.feign.ScoreFeign;
import com.jr.service.IUserService;
import com.jr.util.Result;
import com.jr.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("奥特曼");userDto.setPassword("123456");Result result=scoreFeign.info();if(result.getCode() == ResultCode.SUCCESS.getCode()){userDto.setScoreList((List<Score>) result.get("list"));}return userDto;}
}
4.4.启动类添加注解 @EnableFeignClients
package com.jr;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@SpringBootApplication
@EnableRedisHttpSession
@EnableFeignClients //开始OPenFeign
public class SpringBootMain {public static void main(String[] args) {SpringApplication.run(SpringBootMain.class,args);}
}
5.启动两个项目 (同时)
第一个项目:

第二个项目:

四.添加请求头
1.改第一个项目的控制层UserController
2.修改第二个项目控制器方法,添加了请求头的获得

3.启动项目,使用postman进行测试
1234356是我自己设置的,可以自己设置(但是不能是汉字,可以是大小写字母和数字)

第一个项目的控制台(这里两个是因为我点了两次,实际只有一个)

第二个项目的控制台(这里两个是因为我点了两次,实际只有一个)

4.创建拦截器
第一个项目的header为123456,但是第二个项目的后台为null。
4.4.1在第一个项目创建拦截器类
package com.jr.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);}
}
4.4.2然后重新启动两个项目,用postman工具测试
没有什么要改的postman,直接send,主要是看控制台。

第一个项目的结果,没啥变化

第二个项目的结果,发生了变化。header不是null,而是123456。
![]()
五.参数传递
1.第一个项目下的对应的IUserService
接口,添加两个方法
UserDto add(UserDto user);
UserDto id(String id);

2.在第一个项目下的UserController里添加如下代码
@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) { //对象传值UserDto userDto = userService.add(user);return Result.ok().put("data", userDto);}
3. feign接口, 在第一个项目下的ScoreFeign接口里,添加如下代码
@GetMapping("/score/{id}")Result id(@PathVariable String id);@PostMapping("/score/add")Result add(@RequestBody UserDto user);
4.第一个项目对应的接口实现类,重写两个方法
@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);System.out.println(resultUser);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;}
5.为第二个项目的下的UserController里,添加如下代码
@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("data", user);}
6.启动测试,用postman工具进行测试
5.6.1先用get方法来url传值

5.6.2在用post方法传对象
下面结果是我网卡了,没出来第二张图是对的。


六.我的项目结构
1.第一个项目


2.第二个项目


七.注意
本博客中的四和五大点,中

第一个项目的业务类中的



都和第一个项目,第二个项目的对应
相关文章:
OpenFeign微服务部署
一.开启nacos 和redis 1.查看nacos和redis是否启动 docker ps2.查看是否安装nacos和redis docker ps -a3.启动nacos和redis docker start nacos docker start redis-6379 docker ps 二.使用SpringSession共享例子 这里的两个例子在我的一个博客有创建过程,…...
【C语言】数组(下)
【C语言】数组(下) 6、二维数组的创建6.1二维数组的概念6.2二维数组的创建 7、二维数组的初始化7.1不完全初始化7.2完全初始化7.3按照行初始化7.4初始化时可以省略行,但是不能省略列 8、二维数组的使用8.1 二维数组的下标8.2二维数组的输入和…...
cGANs with Projection Discriminator
基于映射鉴别器的CGAN 模型中,判别器(Discriminator)不是通过将条件信息简单地与特征向量拼接(concatenate)来使用条件信息,而是采用一种基于投影的方式,这种方式更加尊重条件信息在底层概率模…...
mysql学习教程,从入门到精通,SQL HAVING 子句(32)
1、SQL HAVING 子句 当然!HAVING 子句在 SQL 中用于对分组后的结果进行过滤。它通常与 GROUP BY 子句一起使用,以便对聚合函数(如 SUM(), COUNT(), AVG(), MAX(), MIN() 等)的结果进行条件筛选。 以下是一个示例,假设…...
JavaScript while循环语句
While语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。 while(条件){语句;} var i0;while(i<100){console.log(i);i1;} 注意:所有的for循环都可以改写为while循环...
49天精通Java(Day 2):Java的基本语法
上期内容回顾 在上一期的内容中,我们介绍了Java的基本概念、历史背景,并完成了JDK 1.8的安装与环境配置。你还编写并运行了第一个简单的Java程序“Hello, World!”。今天,我们将深入探讨Java的基本语法,包括变量、数据类型、运算…...
uni-app之旅-day01-home页
首页 3.0 创建 home 分支 🍕🍕🍕运行如下的命令,基于 master 分支在本地创建 home 子分支,用来开发和 home 首页相关的功能git branch(查看分支)git checkout -b home(创建home分支) 3.1 配置网络请求 ἲ…...
Vue3轻松实现导出Excel文件功能
文章目录 1.前言2.安装插件3.案例3.1 定义表格数据,设置 id 选择器3.2 据所选 dom 对象生成 sheetbook3.3 写入文件3.4 生成 xlsx文件4.完整代码1.前言 前端常用的导出 Excel的 js 库是 xlsx,但是 xlsx不能设置样式。要想设置样式,必要要结合 xlsx-style 插件一起使用,但是…...
在Kali Linux中使用VNC和iptables配置xrdp以实现远程连接
在Kali Linux中,使用VNC和iptables配置xrdp以实现远程连接涉及几个步骤。不过,值得注意的是,VNC和xrdp是两种不同的远程桌面协议,它们通常不会在同一配置中同时使用(除非有特殊的网络架构需求)。然而&#…...
小徐影院:Spring Boot技术下的影院革新
第四章 系统设计 4.1 系统的功能结构图 通过系统需求分析,本小徐影城管理系统的功能结构设计如图4-1所示: 图4-1 系统功能图 4.2 系统数据库设计 4.2.1 数据库E-R图 在该系统的信息中,由于数据库的支持,我们可以对数据库进行收集…...
命名空间
在 C 中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace 关键字的…...
使用 Elastic 将 AI 摘要添加到你的网站
作者:来自 Elastic Gustavo Llermaly 我们目前所知道的搜索(搜索栏、结果、过滤器、页面等)已经取得了长足的进步,并实现了多种不同的功能。当我们知道找到所需内容所需的关键字或知道哪些文档包含我们想要的信息时,尤…...
dOOv:Java 数据验证与映射库(简化业务逻辑)
dOOv 是一个为 Java 开发人员设计的轻量化库,专注于数据验证和对象间的映射。与传统的验证框架不同,dOOv 通过提供简洁、声明式的 API,使得开发者可以轻松地编写、扩展和维护验证和映射规则。其设计灵感源自领域驱动设计(DDD&…...
Arthas sc(查看JVM已加载的类信息 )
文章目录 二、命令列表2.2 class/classloader相关命令2.2.5 sc(查看JVM已加载的类信息 )举例1:模糊搜索,xx包下所有的类举例2:打印类的详细信息举例3:打印出类的Field信息 本人其他相关文章链接 二、命令列…...
OCR 行驶证识别 离线识别
目录 正页识别 副页识别 全部识别 OCR 行驶证识别 离线识别 正页识别 副页识别 全部识别...
PHP泛目录生成源码,可生成长尾关键词页面,带使用方法视频教程
介绍: 真正的好东西,搞网站优化seo从业必备。可以快速提升网站权重,带来的流量哗哗的 PHP泛目录生成源码 可生成新闻页面和关键词页面 带使用方法视频教程 泛目录可以用来提升网站收录和排名 合理运用目录可以达到快速出词和出权重的效果…...
LeetCode题练习与总结:丑数--263
一、题目描述 丑数 就是只包含质因数 2、3 和 5 的正整数。 给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:n 6 输出:true 解释࿱…...
初识C语言(五)
前言 本文章就代表C语言介绍以及了解正式完成,后续进行具体分析和详细解析学习。知识根深蒂固才可以应付后来的学习,地基要打好,后续才会轻松。 十四、结构体 结构体是C语言中最最重要的知识点,使得C语言有能力描述复杂的类型。 …...
Linux:深入理解冯诺依曼结构与操作系统
目录 1. 冯诺依曼体系结构 1.1 结构分析 1.2 存储结构分布图 2. 操作系统 2.1 概念 2.2 如何管理 2.3 什么是系统调用和库函数 1. 冯诺依曼体系结构 1.1 结构分析 不管是何种计算机,如个人笔记本电脑,服务器,都是遵循冯诺依曼结构。…...
面试中顺序表常考的十大题目解析
在数据结构与算法的面试中,顺序表是一个常见的考点。它作为一种基础的数据结构,涵盖了多种操作和概念,以下将详细介绍面试中关于顺序表常考的十大题目。 💝💝💝如果你对顺序表的概念与理解还存在疑惑&#…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

