文章目录
前言
如果你还没有学习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/pojo
和com/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熔断降级和负载均衡