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 结构分析 不管是何种计算机,如个人笔记本电脑,服务器,都是遵循冯诺依曼结构。…...
面试中顺序表常考的十大题目解析
在数据结构与算法的面试中,顺序表是一个常见的考点。它作为一种基础的数据结构,涵盖了多种操作和概念,以下将详细介绍面试中关于顺序表常考的十大题目。 💝💝💝如果你对顺序表的概念与理解还存在疑惑&#…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...

