【Java】从零到一使用Feign与Sentinel (详细图解)

Java系列文章目录

补充内容 Windows通过SSH连接Linux

第一章 Linux基本命令的学习与Linux历史


文章目录

  • Java系列文章目录
  • 一、前言
  • 二、学习内容:
  • 三、问题描述
  • 四、解决方案:
    • [4.1 认识依赖](#4.1 认识依赖)
    • [4.1.1 Feign依赖](#4.1.1 Feign依赖)
    • [4.1.2 Sentinel依赖](#4.1.2 Sentinel依赖)
    • [4.1.3 负载均衡依赖](#4.1.3 负载均衡依赖)
    • [4.2 父子项目配置](#4.2 父子项目配置)
      • [4.2.1 项目结构](#4.2.1 项目结构)
      • [4.2.2 依赖引入](#4.2.2 依赖引入)
    • [4.3 Feign的使用](#4.3 Feign的使用)
      • [4.3.1 两个服务间的调用](#4.3.1 两个服务间的调用)
      • [4.3.2 Feign调用的注意事项](#4.3.2 Feign调用的注意事项)
    • [4.4 Sentinel的使用](#4.4 Sentinel的使用)
  • 五、总结:
    • [5.1 Feign总结](#5.1 Feign总结)
    • [5.2 Sentinel总结](#5.2 Sentinel总结)
    • [5.3 参考代码](#5.3 参考代码)

一、前言

目的

  • 从零到一学习搭建Feign与Sentinel
  • 先自己配好Knife4j与Sentinel

最终效果

  • 服务间能互相调用
  • 能监控

二、学习内容:

  • 网关配置

🌟 Feign的使用

🌟 Sentinel的使用


三、问题描述

  • 主要记录创建全过程还有配置时候出现的错误

四、解决方案:

4.1 认识依赖

4.1.1 Feign依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

4.1.2 Sentinel依赖

xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-datasource</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

4.1.3 负载均衡依赖

🌟 负载均衡依赖跟微服务相关项目的都要加不然会出错

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

4.2 父子项目配置

4.2.1 项目结构

之前文章讲过不做具体讲述

  • 按之前文章那样配置项目关系

建立如下项目:

4.2.2 依赖引入

直接通过脚手架建立项目

🌟 注意父子项目 都必须是相同配置

初始需要加入的依赖:

  • 通过Spring Web引入Spring Boot
  • 通过Nacos引入Spring Cloud Alibaba
  • 通过Gateway引入Spring Cloud

脚手架生成的配置:

4.3 Feign的使用

4.3.1 两个服务间的调用

假设通过order-service访问User-service

  • 绿色框是另一个服务的方法
  • GetMapping里面的参数要跟被请求的接口保持一致

🌟 使用Feign别忘了启动类加上相关注解

访问流程:

  • 打开网关Knife4j
    注意网关依赖别引错
  • 后台order-service的服务
  • 后台user-service的服务

可以看到我们访问order服务后order服务调用了user服务的方法

4.3.2 Feign调用的注意事项

🌟 如果是通过id访问的一定要显式指出

🌟 由于我引入了Nacos,加入Config依赖且没有配置

4.4 Sentinel的使用

  • 访问地址 http://localhost:8858/
  • 我用docker建的sentinel
  • fallback是失败后会执行的内容
  • 配置类加上相关sentinel依赖
properties 复制代码
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
spring.cloud.sentinel.eager=true
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# spring.cloud.sentinel.transport.client-ip=
  • 我只在order-service加了配置与依赖

监控如下:


五、总结:

5.1 Feign总结

🌟 注意负载均衡依赖要加上

🌟 使用id的时候注意是显示使用

🌟 启动类要加注解

🌟 调用的方法参数要对应上

5.2 Sentinel总结

⭐️ 注意配置要写

5.3 参考代码

  • gateway配置
java 复制代码
server.port=9999
spring.application.name=gateway

# knife4j整合所有的微服务
knife4j.gateway.discovery.enabled=true
knife4j.gateway.enabled=true
knife4j.gateway.tags-sorter=order
knife4j.gateway.operations-sorter=order
knife4j.gateway.strategy=discover

spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.namespace=public

spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origin-patterns=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedHeaders=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowCredentials=true
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[0]=GET
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[1]=POST
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[2]=PUT
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[3]=OPTIONS
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[4]=DELETE
spring.cloud.gateway.discovery.locator.enabled=true

spring.cloud.gateway.routes[0].id=user-service
spring.cloud.gateway.routes[0].uri=lb://user-service
spring.cloud.gateway.routes[0].predicates[0]=Path=/user_service/**
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1

spring.cloud.gateway.routes[1].id=order-service
spring.cloud.gateway.routes[1].uri=lb://order-service
spring.cloud.gateway.routes[1].predicates[0]=Path=/order_service/**
spring.cloud.gateway.routes[1].filters[0]=StripPrefix=1
  • order-service配置
java 复制代码
spring.application.name=order-service
server.port=8082

spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.namespace=public

spring.cloud.sentinel.transport.dashboard=localhost:8858
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
spring.cloud.sentinel.eager=true
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# spring.cloud.sentinel.transport.client-ip=
  • user-service配置
java 复制代码
spring.application.name=user-service
# 应用服务 WEB 访问端口
server.port=8086

spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.namespace=public
spring.cloud.sentinel.transport.dashboard=localhost:8858
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
spring.cloud.sentinel.eager=true
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# spring.cloud.sentinel.transport.client-ip=
  • gateway依赖
java 复制代码
    <parent>
        <groupId>org.example</groupId>
        <artifactId>SentinalAndFeign</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-gateway-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
  • 父项目依赖
java 复制代码
   <packaging>pom</packaging>

    <modules>
        <module>user-service</module>
        <module>gateway</module>
        <module>order-service</module>
    </modules>

    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>3.0.2</spring-boot.version>
        <spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
        <spring-cloud.version>2022.0.0-RC2</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.34</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
<!--            版本控制-->
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-gateway-spring-boot-starter</artifactId>
                <version>4.4.0</version>
            </dependency>
            <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>

(后续有遇到问题再添加)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

相关推荐
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck1 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei1 小时前
java的类加载机制的学习
java·学习
励志成为嵌入式工程师2 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml43 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~3 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616883 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端