OpenFeign微服务部署

news2024/10/2 4:46:54

一.开启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 {
    @Override
    public 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 {
    @Autowired
    private IUserService userService;

    @GetMapping
    public 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 {
    @Override
    public 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 {

    @Autowired
    private 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 {

    @Autowired
    private ScoreFeign scoreFeign;

    @Override
    public 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 {

    @Override
    public 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.第一个项目对应的接口实现类,重写两个方法

  @Override
    public 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;
    }

    @Override
    public 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.第二个项目

七.注意

本博客中的四和五大点,中

第一个项目的业务类中的 

都和第一个项目,第二个项目的对应

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通信工程学习:什么是LTE长期演进

LTE:长期演进 LTE(Long Term Evolution,长期演进)是由3GPP(The 3rd Generation Partnership Project,第三代合作伙伴计划)组织制定的UMTS(Universal Mobile Telecommunications System,通用移动通信系统)技术标准的长期演进。以下是对LTE的详细解释: 一、定…

音乐制作软件FL Studio 24.1.1.4285 中文完整版新功能介绍及如何安装激活FL Studio 24

FL Studio 24.1.1.4285 中文完整版又被国内网友称之为水果音乐制作软件24&#xff0c;是Image-Line公司成立26周年而发布的一个版本&#xff0c;是目前互联网上最优秀的完整的软件音乐制作环境或数字音频工作站&#xff0c;包含了编排&#xff0c;录制&#xff0c;编辑&#xf…

笔墨歌盛世 丹青绘匠心,艺术赋能“百千万工程”

9月30日上午&#xff0c;乡村有“艺”思——2024 年三乡镇乡村文化艺术周启动仪式暨“崛起的力量”余镇河深中通道主题美术作品展开幕仪式在中山市三乡镇古鹤村成荣美术馆举行。 中山市文联党组成员、专职副主席卢曙光&#xff0c;三乡镇党委委员艾立强&#xff0c;中山市文化馆…

leetcode每日一题day21(24.10.1)——最低票价

看到题目&#xff0c;最低消费又有各种的方案&#xff0c;与结合往期每日一题很就没出动态规划&#xff0c;就感觉这题很像动态规划。 思路:对于第X天&#xff0c;买票有三种方案&#xff0c;即从&#xff0c;X-1天买一天的票&#xff0c;X-7买7天的票&#xff0c;X-30买三十天…

iSTFT 完美重构的条件详解

目录 引言1. 短时傅里叶变换&#xff08;STFT&#xff09;与逆变换&#xff08;iSTFT&#xff09;概述2. 完美重构的条件3. 数学推导4. 实现要点5. 示例代码6. 总结 引言 在数字信号处理领域&#xff0c;短时傅里叶变换&#xff08;Short-Time Fourier Transform&#xff0c;简…

Java Web开发详解:从入门到实践

目录 引言 Java Web开发的优势 Java Web开发核心概念 Servlet和JSP Servlet JSP&#xff08;JavaServer Pages&#xff09; MVC架构 JDBC和数据库访问 JDBC概述 数据库连接示例 常用的Java Web框架 Spring MVC Hibernate MyBatis 对比常用框架 Java Web开发流程…

YOLOv5改进系列(1)——添加CBAM注意力机制

一、如何理解注意力机制 假设你正在阅读一本书&#xff0c;同时有人在你旁边说话。当你听到某些关键字时&#xff0c;比如“你的名字”或者“你感兴趣的话题”&#xff0c;你会自动把注意力从书上转移到他们的谈话上&#xff0c;尽管你并没有完全忽略书本的内容。这就是注意力机…

docker零基础入门教程

注意 本系列文章已升级、转移至我的自建站点中&#xff0c;本章原文为&#xff1a;Docker入门 目录 注意1.前言2.docker安装3.docker基本使用4.打包docker镜像5.docker进阶 1.前言 如果你长期写C/C代码&#xff0c;那你应该很容易发现C/C开源项目存在的一个严重问题&#xff…

Xshell-8下载安装教程

下载地址 https://www.xshell.com/zh/free-for-home-school/ 新建Xshell文件夹 点击安装程序 选择新建Xshell文件夹 默认即可 点击安装 注册 提交后点击邮箱收到的链接 点击确认 安装完成

【C/C++】错题记录(三)

题目一 题目二 题目三 题目四 题目五 题目六 题目七&#xff1f;&#xff1f;&#xff1f; 题目八 这道题主要考查对数据类型和位运算的理解与运用。 分析选项 A&#xff1a; *((unsigned char *)(&number) 1)0xcd; 这里将 number 的地址强制转换为 unsigned char* 类型&a…

Qt界面优化——QSS

文章目录 QSS基本语法使用示例样式和代码分离选择器用法子控件选择器伪类选择器盒子模型控件样式示例按钮复选框输入框列表框菜单 登录界面 QSS基本语法 Qt对界面进行优化&#xff0c;主要采用的是QSS。 选择器 {属性名: 属性值; }选择器&#xff1a;先选择某个/类控件&#…

【JVM】双亲委派机制打破双亲委派机制

双亲委派机制 类加载器的双亲委派机制 由于Java虚拟机中有多个类加载器&#xff0c;双亲委派机制的核心是解决一个类到底由谁加载的问题。 双亲委派的作用&#xff1a; 保证类加载的安全性&#xff1a;通过双亲委派机制避免恶意代码替换 JDK中的核心类库。避免重复加载&…

算法题总结(五)——普通数组

普通数组 #238、除自身以外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要…

JDBC相关内容

第1章&#xff1a;JDBC概述 1.1 数据的持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大…

进程--消息队列和共享内存

目录 消息队列 创建消息队列 删除消息队列 发送消息和接收 消息队列 消息队列就是一个消息的列表&#xff0c;进程可以在消息队列中添加消息和的读取消息 消息队列具有FIFO的特性&#xff0c;具有无名管道与有名管道各自的优势&#xff0c;可以支持任意两个进程的进程间通讯…

【python实操】python小程序之随机抽签以及for循环计算0-x的和

引言 python小程序之随机抽签以及for循环计算0-x的和 文章目录 引言一、随机抽签1.1 题目1.2 代码1.3 代码解释 二、for循环计算0-x的和2.1 题目2.2 代码2.3 代码解释 三、思考3.1 随机抽签3.2 for循环计算0-x的和 一、随机抽签 1.1 题目 使用input输入五个同学的名字随机抽取…

对于基础汇编的趣味认识

汇编语言 机器指令 机器语言是机器指令的集合 机器指令展开来讲就是一台机器可以正确执行的命令 电子计算机的机器指令是一列二进制数字 &#xff08;计算机将其转变为一列高低电平&#xff0c;使得计算机的电子器件受到驱动&#xff0c;进行运算 寄存器&#xff1a;微处理器…

zabbix7.0创建自定义模板的案例详解(以监控httpd服务为例)

前言 服务端配置 链接: rocky9.2部署zabbix服务端的详细过程 环境 主机ip应用zabbix-server192.168.10.11zabbix本体zabbix-client192.168.10.12zabbix-agent zabbix-server(服务端已配置) 创建模板 模板组直接写一个新的&#xff0c;不用选择 通过名称查找模板&#xf…

动手学深度学习(李沐)PyTorch 第 6 章 卷积神经网络

李宏毅-卷积神经网络CNN 如果使用全连接层&#xff1a;第一层的weight就有3*10^7个 观察 1&#xff1a;检测模式不需要整张图像 很多重要的pattern只要看小范围即可 简化1&#xff1a;感受野 根据观察1 可以做第1个简化&#xff0c;卷积神经网络会设定一个区域&#xff0c…

wenyan:markdown 一键转换文章排版

介绍 今天给大家介绍一个markdown排版成自媒体文章的工具。 markdown 的重要性和便捷性不用再多说&#xff0c;但是从markdown 转换到文章排版&#xff0c;我换了很多个也都很不满意&#xff0c;尤其在不支持markdown的平台&#xff0c;更是一言难尽。 本次介绍的wenyan的核心…