微服务之OpenFeign 服务调用

文章目录

前言

如果你还没有学习nacos可以看之前的博客微服务之SpringCloud Alibaba(注册中心Nacos),这篇博客接着上一篇的讲的

1.简介

微服务架构中使用OpenFeign进行服务调用,OpenFeign提供了一种简洁的方式来定义和处理服务间的调用。 OpenFeign作为一个声明式的、模块化的HTTP客户端,通过接口 的定义和注解的使用,简化了微服务之间的通信调用。

2.案例openfeign

我们使用openfeign就是实现模块之间的互相调用。比如我们的bill-consumer调用bill-provider这就需要openfeign。

创建bill-consumer-7790模块

创建新模块

创建bill-consumer-7790

新建模块

勾选依赖,点击创建。

修改本模块pom文件

不要全粘,看着复制。

xml 复制代码
<?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.hsh</groupId>
    <artifactId>bill-consumer-7790</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>bill-consumer-7790</name>
    <description>bill-consumer-7790</description>

    <!--  子级打包方式  -->
    <packaging>jar</packaging>
    <!--  引用父级  -->
    <parent>
        <groupId>com.hsh</groupId>
        <artifactId>cloud-alibaba-test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!--        <spring-boot.version>2.7.6</spring-boot.version>-->
<!--        <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>-->
<!--        <spring-cloud.version>2021.0.5</spring-cloud.version>-->
    </properties>
    <dependencies>
        <!--  引入nacos  -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
        </dependency>
        <!-- OpenFeign 使用依赖loadbalancer 做负载均衡,所以我得导入这个包  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-web</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.alibaba.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-openfeign</artifactId>-->
<!--        </dependency>-->

<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-test</artifactId>-->
<!--            <scope>test</scope>-->
<!--        </dependency>-->
    </dependencies>
<!--    <dependencyManagement>-->
<!--        <dependencies>-->
<!--            <dependency>-->
<!--                <groupId>org.springframework.cloud</groupId>-->
<!--                <artifactId>spring-cloud-dependencies</artifactId>-->
<!--                <version>${spring-cloud.version}</version>-->
<!--                <type>pom</type>-->
<!--                <scope>import</scope>-->
<!--            </dependency>-->
<!--            <dependency>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-dependencies</artifactId>-->
<!--                <version>${spring-boot.version}</version>-->
<!--                <type>pom</type>-->
<!--                <scope>import</scope>-->
<!--            </dependency>-->
<!--            <dependency>-->
<!--                <groupId>com.alibaba.cloud</groupId>-->
<!--                <artifactId>spring-cloud-alibaba-dependencies</artifactId>-->
<!--                <version>${spring-cloud-alibaba.version}</version>-->
<!--                <type>pom</type>-->
<!--                <scope>import</scope>-->
<!--            </dependency>-->
<!--        </dependencies>-->
<!--    </dependencyManagement>-->

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.hsh.billconsumer7790.BillConsumer7790Application</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

修改父级pom文件

xml 复制代码
<?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.hsh</groupId>
    <artifactId>cloud-alibaba-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-alibaba-test</name>
    <description>cloud-alibaba-test</description>
    <!--  指定打包方式  -->
    <packaging>pom</packaging>
    <!--  引用子级模块  -->
    <modules>
        <!-- 引入bill-provider-7780  -->
        <module>bill-provider-7780</module>
        <!--   引入bill-consumer-7790  -->
        <module>bill-consumer-7790</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
        <!-- 引入spring-cloud版本  因为openfeign依赖于spring-cloud 所以我要引入 -->
        <spring-cloud.version>2021.0.5</spring-cloud.version>
    </properties>

    <dependencies>
        <!-- 引入lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 引入子级的openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <!-- 将子级spring-cloud放到这里共用 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--  将上面的 dependencies中的 spring-cloud-starter-alibaba-nacos-discovery 放在这里-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.hsh.cloudalibabatest.CloudAlibabaTestApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

整理文件夹

改完之后如下

修改配置文件

application.properties修改为application.yml

yml 复制代码
server:
  port: 7790
spring:
  application:
    name: bill-consumer-7790 # 服务名
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: 127.0.0.1:8848
  # 数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root

创建cloud-common模块

创建模块


构建成功后在你的父级会自动引入<module>cloud-common</module>

修改配置文件

注释掉下面的内容

xml 复制代码
<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 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.hsh</groupId>
        <artifactId>cloud-alibaba-test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>cloud-common</artifactId>
    <packaging>war</packaging>
<!--    <name>cloud-common Maven Webapp</name>-->
<!--    <url>http://maven.apache.org</url>-->
    <dependencies>
        <!-- 
              需要引入mybatis-plus依赖 因为我的实体类需要使用
              @TableName(value = "smbms_bill") 
        -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>junit</groupId>-->
<!--            <artifactId>junit</artifactId>-->
<!--            <version>3.8.1</version>-->
<!--            <scope>test</scope>-->
<!--        </dependency>-->
    </dependencies>
    <build>
        <finalName>cloud-common</finalName>
    </build>
</project>

整理文件夹

新建文件java,然后新建com/hsh/pojocom/hsh/utils

utils中新建类

新建类ResultJSON

java 复制代码
package com.hsh.utils;

import java.io.Serializable;

/**
 * @Author: wzy
 * @Date: 2024/11/13 11:03
 * @Description: 返回结果类
 */
public class ResultJSON<T> implements Serializable {
    private Integer code;
    private String msg;
    private T data;
    public ResultJSON() {}
    public ResultJSON(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;

    }

    /**
     * 操作成功或者失败
     * @param c 受影响行数
     * @return 当前传入的受影响行数>0则返回成功,否则返回失败
     */
    public static  ResultJSON successORerror(int c){
        return c>0?new ResultJSON(200,"操作成功",c)
                :new ResultJSON(400,"操作失败",c);
    }

    public static ResultJSON success(){
        return new ResultJSON(200,"操作成功",null);
    }
    public static ResultJSON success(String msg){
        return new ResultJSON(200,msg,null);
    }
    public static <T> ResultJSON success(T data){
        return new ResultJSON(200,"操作成功",data);
    }
    public static ResultJSON success(Integer code,String msg){
        return new ResultJSON(code,msg,null);
    }
    public static <T> ResultJSON success(String msg,T data){
        return new ResultJSON(200,msg,data);
    }
    public static <T> ResultJSON success(Integer code,String msg,T data){
        return new ResultJSON(code,msg,data);
    }

    public static ResultJSON error(){
        return new ResultJSON(500,"操作失败",null);
    }
    public static ResultJSON error(String msg){
        return new ResultJSON(500,msg,null);
    }
    public static ResultJSON error(Integer code,String msg){
        return new ResultJSON(code,msg,null);
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

pojo中新建类

java 复制代码
package com.hsh.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;


@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "smbms_bill")
public class Bill implements Serializable {
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;   //id
    private String billCode; //账单编码
    private String productName; //商品名称
    private String productDesc; //商品描述
    private String productUnit; //商品单位
    private Integer productCount; //商品数量
    private BigDecimal totalPrice; //总金额
    private Integer isPayment; //是否支付
    private Integer providerId; //供应商ID
    private Integer createdBy; //创建者
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")// 用户对象属性,控制入参时日期类型转换
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")// 返回JSON数据时日期类型处理
    private Date creationDate; //创建时间
    private Integer modifyBy; //更新者
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")// 用户对象属性,控制入参时日期类型转换
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")// 返回JSON数据时日期类型处理
    private Date modifyDate;//更新时间
}

修改bill-provider-7780模块

修改pom文件

dependencies中引入

xml 复制代码
<!-- mybatis-plus依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<!-- 引入mysql驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

修改配置文件

yml 复制代码
server:
  port: 7780
spring:
  application:
    name: bill-provider-7780 # 服务名
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: 127.0.0.1:8848
  # 数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root
# mybatis-plus:
mybatis-plus:
  mapper-locations: classpath:mappers/*.xml # 扫描mappers映射文件
  type-aliases-package: com.hsh.pojo # 扫描别名
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印sql到控制台
    map-underscore-to-camel-case: false # 关闭驼峰映射

修改父级的pom.xml

在dependencies添加依赖,而不是在dependencyManagement下dependencies下添加。

xml 复制代码
<dependency>
    <groupId>com.hsh</groupId>
    <artifactId>cloud-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

编写启动类

开启mybatis-plus的扫包。

java 复制代码
package com.hsh.billprovider7780;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.hsh.billprovider7780.mapper")
public class BillProvider7780Application {
    public static void main(String[] args) {
        SpringApplication.run(BillProvider7780Application.class, args);
    }
}

新建文件夹mapper

在此模块的com/hsh下新建mapper

java 复制代码
package com.hsh.billprovider7780.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hsh.pojo.Bill;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface BillMapper extends BaseMapper<Bill> {
}

新建文件夹service

在此模块的com/hsh下新建service

java 复制代码
package com.hsh.billprovider7780.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hsh.pojo.Bill;
import com.hsh.utils.ResultJSON;

public interface BillService extends IService<Bill> {
    ResultJSON findBillListById(Integer id);
}

在此模块的com/hsh/service下新建impl

java 复制代码
package com.hsh.billprovider7780.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hsh.billprovider7780.mapper.BillMapper;
import com.hsh.billprovider7780.service.BillService;
import com.hsh.pojo.Bill;
import com.hsh.utils.ResultJSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BillServiceImpl extends ServiceImpl<BillMapper,Bill> implements BillService {
    @Autowired
    private BillMapper billMapper;
    @Override
    public ResultJSON findBillListById(Integer id) {
        System.out.println("这是provider7780====" + id);
        Bill bill = billMapper.selectById(id);
        return ResultJSON.success(bill);
    }
}

新建文件夹api

这里的api就是controller给其他模块调用

java 复制代码
package com.hsh.billprovider7780.api;

import com.hsh.billprovider7780.service.BillService;
import com.hsh.utils.ResultJSON;
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("/bill")
public class BillServiceApi {
    @Autowired
    private BillService billService;
    @GetMapping("/findBillListById")
    public ResultJSON findBillListById(Integer  id){
        return billService.findBillListById(@RequestParam("id") id);
    }
}

修改bill-provider-7790模块调用其他模块

新建service模块

在com/hsh/billconsumer7790文件夹下新建如下的目录

在api下新建接口

java 复制代码
package com.hsh.billconsumer7790.service.api;

import com.hsh.utils.ResultJSON;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

// @FeignClient()是调用的服务名称,即调用哪个模块哪个类
@FeignClient(name = "bill-provider-7780",path = "bill")
public interface BillService {
    @GetMapping("/findBillListById")
    ResultJSON findBillListById(@RequestParam("id") Integer id);
}

新建controller

在com/hsh/billconsumer7790文件夹下新建controller目录

java 复制代码
package com.hsh.billconsumer7790.controller;

import com.hsh.billconsumer7790.service.api.BillService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("bill")
public class BillController {
    @Resource
    private BillService billService;
    @RequestMapping("/find")
    public Object find(Integer id){
        return billService.findBillListById(@RequestParam("id") id);
    }
}

启动类开启OpenFeign

java 复制代码
package com.hsh.billconsumer7790;

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

@SpringBootApplication
@EnableFeignClients // 开启OpenFeign
public class BillConsumer7790Application {

    public static void main(String[] args) {
        SpringApplication.run(BillConsumer7790Application.class, args);
    }
}

启动nacos

这个指令是,可以自己新建一个.bat文件保存一下

bash 复制代码
# 后缀standalone指的是以单例的方式进行启动
.\startup.cmd -m standalone

输入http://192.168.108.11:8848/nacos/index.html如下

启动项目测试

先启动BillProvider7780

在启动BillConsumer7790

输入路径http://127.0.0.1:7790/bill/find?id=1

结果如下

未完待续...

请看下一篇博客微服务之hystrix熔断降级和负载均衡

相关推荐
fakerth4 小时前
【OpenHarmony】sensors_miscdevice小器件模块架构
架构·操作系统·openharmony
rechol4 小时前
ARM 架构核心知识笔记(整理与补充版)
arm开发·笔记·架构
小猪咪piggy4 小时前
【微服务】(2) 环境和工程搭建
微服务·云原生·架构
xrkhy4 小时前
微服务之配置中心Nacos
微服务·架构
xrkhy4 小时前
微服务之Gateway网关(1)
微服务·架构·gateway
喵叔哟4 小时前
62.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--自训练ML模型
微服务·架构·.net
qq_264220896 小时前
k8s-Pod详解
云原生·容器·kubernetes
小诸葛的博客7 小时前
k8s localpath csi原理
云原生·容器·kubernetes
小猿姐11 小时前
闲谈KubeBlocks For MongoDB设计实现
mongodb·云原生·kubernetes