微服务demo(三)nacosfeign

一、feign使用

1、集成方法
1.1、pom

consumer添加依赖

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
1.2、启动类

consumer启动类加上@EnableFeignClients注解,即开启feign;

1.3、consumer调用provider:

编写一个中间service,consumer调用service,service调用provider。这个service类头加@FeignClient注解:

@FeignClient(value = "my-service",path = "/myProvider")

(1)value:provider配置文件中的spring.application.name,

    注意这里的value值不分大小写,my-service和MY-SERVICE都可以。

(2)path:如果provider在配置文件里面配置了server.context-path,FeignClient就需要指明path。

2、调用方法

上面提到的service,关于service调用provider传参的问题:

2.1、无参调用

post、get请求都可以

2.2、非对象参数

如Integer、String等,适用于get请求。

service方法上需要加@RequestParam注解,且括号中一定要有值(参数的别名)和被调用方provider的参数名保持一致,被调用方可加@RequestParam也可不加;

2.3、对象参数

javaBean,map,list等,只适用于post请求。

被调用方provider加@RequestBody注解,调用方service的方法可加可不加;

2.4、header头部参数:

provider和service方法上都使用@RequestHeader注解,且value指明参数别名。

二、集成demo

1、初版

1.1、父pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo.nacos</groupId>
    <artifactId>nacos-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-demo</name>
    <packaging>pom</packaging>

    <!-- springBoot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
    </parent>

    <!-- 模块说明:这里声明多个子模块 -->
    <modules>
        <module>provider</module>
        <module>consumer</module>
        <module>nacos-common</module>
    </modules>

    <!-- 版本说明:这里统一管理依赖的版本号 -->
    <dependencyManagement>
        <dependencies>
            <!-- SpringCloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
            </dependency>

            <!-- SpringCloud Alibaba -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
            </dependency>

            <!--服务注册-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>0.2.2.RELEASE</version>
            </dependency>
            <!-- nacos 注册中心客户端 -->
            <!--        <dependency>-->
            <!--            <groupId>com.alibaba.cloud</groupId>-->
            <!--            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
            <!--            <version>2.1.0.RELEASE</version>-->
            <!--        </dependency>-->

            <!--集中配置-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
                <version>2.1.0.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--nocas必须在web环境下-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
1.2、provider:

(1)pom:

 <parent>
        <artifactId>nacos-demo</artifactId>
        <groupId>com.demo.nacos</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.demo.nacos</groupId>
            <artifactId>nacos-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!-- SpringCloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
        </dependency>

        <!-- SpringCloud Alibaba -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        </dependency>

        <!--服务注册-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--集中配置-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

(2)bootstrap:

spring:
  application:
    name: my-service
  cloud:
    compatibility-verifier:
      enabled: false
    nacos:
      #服务注册
      discovery:
        server-addr: xxx.xx.xxx:8848
        #配置中心
      config:
        server-addr: xxx.xx.xxx:8848
        group: wtyy
  profiles:
    active: prod
server:
  port: 1111
  servlet:
    context-path: /myProvider

 (3)启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

(4)controller接口

import com.demo.nacos.common.dto.UserDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/configTest")
//刷新配置
@RefreshScope
public class ProviderTestController {

    @Value("${user.text}")
    private String userText;

    private static Logger logger = LoggerFactory.getLogger(ProviderTestController.class);


    /**
     * 1、无参 无返回
     * @param request
     * @return
     * @throws InterruptedException
     */
    @GetMapping("/hanNoParam")
    public void getUserText(HttpServletRequest request) throws InterruptedException {
        logger.info("调用无参接口");
    }

    /**
     * 2、有参
     * @return
     * @throws InterruptedException
     */
    @GetMapping("/hanParams")
    public String hanParams(String userName) throws InterruptedException {
        logger.info("调用有参接口");
        return userName+":"+userText;
    }

    /**
     * 3、有参,对象参数
     * @return
     * @throws InterruptedException
     */
    @PostMapping("/hanObjParams")
    public UserDTO hanObjParams(@RequestBody UserDTO userDTO) throws InterruptedException {
        logger.info("调用对象参数接口");
        return userDTO;
    }

    /**
     * 4、参数加header
     * @return
     * @throws InterruptedException
     */
    @PostMapping("/hanParamsAndHeader")
    public String hanParamsAndHeader(@RequestBody UserDTO userDTO,@RequestHeader("token") String token) throws InterruptedException {
        logger.info("调用参数和header接口");
        return userDTO.getUserName()+"的token:"+token;
    }
}
 1.3、consumer:

(1)pom:

<parent>
        <artifactId>nacos-demo</artifactId>
        <groupId>com.demo.nacos</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.demo.nacos</groupId>
            <artifactId>nacos-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!-- SpringCloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
        </dependency>

        <!-- SpringCloud Alibaba -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        </dependency>

        <!--服务注册-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--集中配置-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

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

    </dependencies>

(2) bootstrap:

spring:
  application:
    name: my-consumer
  cloud:
    compatibility-verifier:
      enabled: false
    nacos:
      #服务注册
      discovery:
        server-addr: xxx.xx.xxx:8848
        #配置中心
      config:
        server-addr: xxx.xx.xxx:8848
        group: wtyy
server:
  port: 2222
  servlet:
    context-path: /myConsumer

(3) 启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

(4) service:重点

import com.demo.nacos.common.dto.UserDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(value = "my-service",path = "/myProvider")
public interface NacosConfigTestService {


    @RequestMapping("/configTest/hanNoParam")
    void hanNoParam();

    @RequestMapping("/configTest/hanParams")
    String hanParams(@RequestParam("userName")String userName);

    @RequestMapping("/configTest/hanObjParams")
    UserDTO hanObjParams(@RequestBody UserDTO userDTO);

    @RequestMapping("/configTest/hanParamsAndHeader")
    String hanParamsAndHeader(@RequestBody UserDTO userDTO,@RequestHeader("token") String token);
}

(5) controler:

import com.demo.nacos.common.dto.UserDTO;
import com.demo.nacos.consumer.service.NacosConfigTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/consumerTest")
public class ConsumerTestController {

    @Autowired
    private NacosConfigTestService nacosConfigTestService;

    @GetMapping("/hanNoParam")
    public void getTemp(HttpServletRequest request) throws InterruptedException {
        nacosConfigTestService.hanNoParam();
    }

    @GetMapping("/hanParams")
    public String hanParams(String userName) throws InterruptedException {
        return nacosConfigTestService.hanParams(userName);
    }

    @PostMapping("/hanObjParams")
    public UserDTO hanObjParams(@RequestBody UserDTO userDTO) throws InterruptedException {
        return nacosConfigTestService.hanObjParams(userDTO);
    }

    @PostMapping("/hanParamsAndHeader")
    public String hanParamsAndHeader(@RequestBody UserDTO userDTO,HttpServletRequest request) throws InterruptedException {
        String token = request.getHeader("token");
        return nacosConfigTestService.hanParamsAndHeader(userDTO,token);
    }
}
1.4、测试

分别启动provider、consumer,可以看到都注册到nacos上了:

(1)非对象参数

(2)对象参数

(3)对象参数&header

2、feign的继承特性

上面的代码有很多重复的地方,下面利用feign的继承特性进行抽取。

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

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

相关文章

3.28总结

1.java学习记录 1.方法的重载 重载换而言之其实就是函数名不变&#xff0c;但是其中的参数需要改变&#xff0c;可以三个方面改变&#xff08;参数类型&#xff0c;参数顺序&#xff0c;参数个数这三个方面入手&#xff0c;这样可以运用的&#xff09; 但是&#xff1a;注意…

深度学习论文: Attention is All You Need及其PyTorch实现

深度学习论文: Attention is All You Need及其PyTorch实现 Attention is All You Need PDF:https://arxiv.org/abs/1706.03762.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 大多数先进的神经序列转换模型采用编码器-解码器结构&#xff0c;其中编码器将…

IP种子是什么?理解和应用

在网络世界中&#xff0c;IP种子是一个广泛应用于文件共享和网络下载领域的概念。它是一种特殊的标识符&#xff0c;用于识别和连接到基于对等网络&#xff08;P2P&#xff09;协议的文件共享网络中的用户或节点。本文将深入探讨IP种子的含义、作用以及其在网络中的应用。 IP地…

Windows 最佳文件管理器:快速、简单、直观、自由 | 开源日报 No.175

files-community/Files Stars: 30.6k License: MIT Files 是为 Windows 构建的最佳文件管理器应用程序。该项目解决了在 Windows 上进行文件管理时的困难。 它具有以下主要功能和优势&#xff1a; 采用直观设计&#xff0c;使浏览文件变得更加简单支持标签、预览和自定义背景…

OceanBase OBCA 数据库认证专员考证视频

培训概述 OceanBase 认证是 OceanBase 官方推出的唯一人才能力认证体系&#xff0c;代表了阿里巴巴及蚂蚁集团官方对考生关于 OceanBase 技术能力的认可&#xff0c;旨在帮助考生更好地学习 OceanBase 数据库产品&#xff0c;早日融入 OceanBase 技术生态体系&#xff0c;通过由…

Intellij IDEA安装配置Spark与运行

目录 Scala配置教程 配置Spark运行环境 编写Spark程序 1、包和导入 2、定义对象 3、主函数 4、创建Spark配置和上下文 5、定义输入文件路径 6、单词计数逻辑 7、输出结果 8、完整代码&#xff1a; Scala配置教程 IDEA配置Scala&#xff1a;教程 配置Spark运行环境 …

3.Labview字符串与路径精讲(下) — 字符串及路径的用法汇总

本章讲解labview中的字符串和路径具体实践用例&#xff0c;从前面板字符串属性到后面板字符串函数应用做出详细概述&#xff0c;通过本文的学习希望大家了解到字符串及路径在labview编程中的重要地位。 本系列文章为labview 从基础到强化到精通的学习文章&#xff0c;大家可以随…

网站为什么要选择使用安全加速SCDN?

安全加速SCDN&#xff08;安全内容交付网络&#xff09;是一种网络加速服务&#xff0c;旨在提高网站和应用程序的性能和安全性。它使用专门的技术和基础设施来加速内容传输并保护网站免受网络攻击。 安全加速SCDN可以通过内容缓存、快速传输和动态路由技术来加速网站和应用程…

使用Jenkins打包时执行失败,但手动执行没有问题如ERR_ELECTRON_BUILDER_CANNOT_EXECUTE

具体错误信息如&#xff1a; Error output: Plugin not found, cannot call UAC::_ Error in macro _UAC_MakeLL_Cmp on macroline 2 Error in macro _UAC_IsInnerInstance on macroline 1 Error in macro _If on macroline 9 Error in macro FUNCTION_INSTALL_MODE_PAGE_FUNC…

LeetCode:718最长重复子数组 C语言

718. 最长重复子数组 提示 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,…

钡铼技术R40路由器助力智能船舶航行数据实时传输与分析

钡铼技术R40路由器在智能船舶领域的应用&#xff0c;对于航行数据的实时传输与分析具有重要意义。随着航运业的不断发展和智能化水平的提升&#xff0c;船舶航行数据的及时传输和有效分析对船舶的安全、运营效率等方面至关重要。而引入钡铼技术R40路由器&#xff0c;则可以实现…

k8s1.28.8版本配置prometheus监控告警

文章目录 官方架构图组件的具体介绍kube-prometheus包含的组件简介&#xff1a;文件存储路径&#xff1a; 结构分析官网自带的一些规则自己总结流程 1-创建规则磁盘使用率报警规则 详解上面rule流程Alertmanagerg查看 2-报警接收器2.1-邮件报警修改Alertmanager配置查看现有的s…

全局UI方法-弹窗六-自定义弹窗

1、描述 通过CustomDialogController类显示自定义弹窗。使用弹窗组件时&#xff0c;可优先考虑自定义弹窗&#xff0c;便于自定义弹窗的样式与内容。 2、接口 CustomDialogController(value:{builder: CustomDialog, cancel?: () > void, autoCancel?: boolean, alignme…

稀碎从零算法笔记Day32-LeetCode:每日温度

算是引出“单调栈”这种数据结构&#xff0c;后面会用这个思想处理下接雨水问题 前言&#xff1a;单调栈模式匹配——题目中提到“求第一个最大/最小的元素” 题型&#xff1a;栈、单调栈、数组 链接&#xff1a;739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 来源…

C# OpenCv Haar、LBP 人脸检测

目录 效果 代码 下载 效果 代码 using OpenCvSharp;namespace OPenCVDemo {class Program{static void Main(string[] args){// Load the cascadesvar haarCascade new CascadeClassifier("haarcascade_frontalface_default.xml");var lbpCascade new Casca…

SpringCloud和SpringCloudAlibaba的区别

1、SpringCloud和SpringCloudAlibaba的区别 SpringCloudAlibaba实际上对我们的SpringCloud2.x和1.x实现拓展组件功能。 nacos是分布式配置中心分布式注册中心Eurekaconfig。 研发SpringCloudAlibaba目的是为了推广阿里的产品&#xff0c;如果使用了SpringCloudAlibaba,最好使…

学习笔记——微信小程序读取当前时间

<view class"box"><text>日期:</text><view class"date">{{obtaindate}}</view></view> wxml中定义了一个文本元素&#xff0c;通过{{obtaindate}}获取js页面传递的日期数据 data:{obtaindate:"" }, onlo…

百度智能小程序源码系统简洁版 SEO关键词排名推广优化 带完整的安装代码包以及搭建教程

移动互联网的快速发展&#xff0c;小程序以其轻量级、无需下载、即用即走的特点&#xff0c;迅速成为了各大平台争相推广的重要产品形态。百度智能小程序作为百度生态下的重要一环&#xff0c;凭借其强大的流量入口和丰富的功能组件&#xff0c;为开发者提供了广阔的创作空间。…

持续集成流程主要系统构成介绍(CI)

目录 一、概述 二、版本控制系统 2.1 概述 2.2 版本控制系统使用流程示意图 2.3 版本控制软件划分 2.3.1 集中式版本控制软件 2.3.2 分布式版本控制软件 2.3.3 总结 2.4 常用版本控制软件介绍 三、编译构建系统 3.1 概述 3.2 编译构建流程示意图 3.3 列举Java 源码…

深度学习十大算法之Word2Vec

Word2Vec模型介绍 1. 背景介绍 自然语言处理和词嵌入的重要性 自然语言处理&#xff08;NLP&#xff09;一直是人工智能领域中最具挑战性的问题之一。它旨在使计算机能够理解和解释人类语言&#xff0c;从而完成如文本翻译、情感分析和语音识别等任务。在这个过程中&#xf…