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

Java系列文章目录

补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史


一、前言

目的

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

最终效果

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

二、学习内容:

  • 网关配置

🌟 Feign的使用
🌟 Sentinel的使用


三、问题描述

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

四、解决方案:

4.1 认识依赖

4.1.1 Feign依赖

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

4.1.2 Sentinel依赖


<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 负载均衡依赖

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

<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依赖
# 取消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配置
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配置
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配置
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依赖
    <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>
  • 父项目依赖
   <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>

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


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

在这里插入图片描述

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在微服务架构中,Feign是一个声明式的HTTP客户端,它使得编写HTTP请求变得更加简单。它使用了Ribbon来实现负载均衡,并且集成了Hystrix来提供服务降级和容错功能。 而Sentinel是一个开源的流量控制组件,它能够对系统中的API进行实时监控、统计和保护。Sentinel可以通过定义规则来限制对服务的访问,当达到设定的阈值时可以进行流量控制、熔断降级等操作,以保证系统的稳定性和可靠性。 当使用Feign进行服务调用时,我们可以配合使用Sentinel来实现服务的降级。具体步骤如下: 1. 引入FeignSentinel的依赖: 在项目的pom.xml文件中添加FeignSentinel的依赖,例如: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> ``` 2. 配置FeignSentinel: 在项目的配置文件中配置FeignSentinel相关的属性,例如: ```yaml spring: cloud: sentinel: transport: dashboard: localhost:8080 port: 8719 feign: sentinel: enabled: true ``` 3. 定义Feign接口: 在接口上使用`@FeignClient`注解,指定要调用的服务名和降级处理的类,例如: ```java @FeignClient(value = "service-provider", fallback = HelloFallback.class) public interface HelloService { @GetMapping("/hello") String hello(); } ``` 4. 实现降级处理类: 创建一个实现了Feign接口的降级处理类,例如: ```java @Component public class HelloFallback implements HelloService { @Override public String hello() { return "Fallback message"; } } ``` 使用FeignSentinel进行服务降级后,当服务调用失败或达到设定的流量控制阈值时,将会执行降级处理类中定义的逻辑,返回预设的降级结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值