微服务之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 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 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

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>
在这里插入图片描述

修改配置文件

注释掉下面的内容

<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

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中新建类

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中引入

<!-- 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>

修改配置文件

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下添加。

<dependency>
<groupId>com.hsh</groupId>
<artifactId>cloud-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

编写启动类

开启mybatis-plus的扫包。

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

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

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

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给其他模块调用

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下新建接口

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目录

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

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文件保存一下

# 后缀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熔断降级和负载均衡

posted @ 2026-01-26 08:48  yangykaifa  阅读(6)  评论(0)    收藏  举报