微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine

Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数据。但是只使用Hystrix Dashboard的话, 你只能看到单个应用内的服务信息, 这明显不够. 我们需要一个工具能让我们汇总系统内多个服务的数据并显示到Hystrix Dashboard上, 这个工具就是Turbine.用数据、图表展示更加直观,让数据说话,一图顶千言。

一、Hystrix Dashboard

1.引入依赖

在EurekaConsumer项目中引入Hystrix Dashboard也比较容易,只需在pom.xml中引入依赖,主要引入spring-cloud-starter-netflix-hystrix、spring-cloud-starter-netflix-hystrix-dashboard、spring-boot-starter-actuator。

微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.6.RELEASEversion>
        <relativePath/>
    parent>
    <groupId>com.examplegroupId>
    <artifactId>EurekaConsumerartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>EurekaConsumername>
    <description>Demo project for Spring Bootdescription>
<span>&lt;</span><span>properties</span><span>&gt;</span>
    <span>&lt;</span><span>java.version</span><span>&gt;</span>1.8<span><span>java.version</span><span>&gt;</span>
    <span>&lt;</span><span>spring-cloud.version</span><span>&gt;</span>Greenwich.SR1<span><span>spring-cloud.version</span><span>&gt;</span>
<span><span>properties</span><span>&gt;</span>

<span>&lt;</span><span>dependencies</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-starter-web<span><span>artifactId</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.cloud<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-cloud-starter-netflix-eureka-client<span><span>artifactId</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.cloud<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-cloud-starter-openfeign<span><span>artifactId</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.cloud<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-cloud-openfeign-core<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>2.1.2.RELEASE<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.cloud<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-cloud-starter-netflix-hystrix<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>2.1.2.RELEASE<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.cloud<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-cloud-starter-netflix-hystrix-dashboard<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>2.1.2.RELEASE<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-starter-actuator<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>2.1.6.RELEASE<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-starter-test<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>scope</span><span>&gt;</span>test<span><span>scope</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
<span><span>dependencies</span><span>&gt;</span>
<span>&lt;</span><span>dependencyManagement</span><span>&gt;</span>
    <span>&lt;</span><span>dependencies</span><span>&gt;</span>
        <span>&lt;</span><span>dependency</span><span>&gt;</span>
            <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.cloud<span><span>groupId</span><span>&gt;</span>
            <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-cloud-dependencies<span><span>artifactId</span><span>&gt;</span>
            <span>&lt;</span><span>version</span><span>&gt;</span>${spring-cloud.version}<span><span>version</span><span>&gt;</span>
            <span>&lt;</span><span>type</span><span>&gt;</span>pom<span><span>type</span><span>&gt;</span>
            <span>&lt;</span><span>scope</span><span>&gt;</span>import<span><span>scope</span><span>&gt;</span>
        <span><span>dependency</span><span>&gt;</span>
    <span><span>dependencies</span><span>&gt;</span>
<span><span>dependencyManagement</span><span>&gt;</span>

<span>&lt;</span><span>build</span><span>&gt;</span>
    <span>&lt;</span><span>plugins</span><span>&gt;</span>
        <span>&lt;</span><span>plugin</span><span>&gt;</span>
            <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
            <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-maven-plugin<span><span>artifactId</span><span>&gt;</span>
        <span><span>plugin</span><span>&gt;</span>
    <span><span>plugins</span><span>&gt;</span>
<span><span>build</span><span>&gt;</span>

<span>&lt;</span><span>packaging</span><span>&gt;</span>war<span><span>packaging</span><span>&gt;</span>

project>

View Code

2.启用@EnableHystrixDashboard、@EnableCircuitBreaker

在main方法类中增加注解@EnableHystrixDashboard、@EnableCircuitBreaker,如果只是添加注解还是不够的,运行的时候会报404的错误,还需要在EurekaConsumerApplication类中增加ServletRegistrationBean,设置映射的url。

微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;

import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrixDashboard
@EnableCircuitBreaker

public class EurekaConsumerApplication {

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

      @Bean
      public ServletRegistrationBean getServlet() {
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;
      }
}

View Code

3.输入http://localhost:9001/hystrix时,会显示如下页面

微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine

在上面的页面输入http://localhost:9001/hystrix.stream,点击Monitor Stream,然后请求http://localhost:9001/hello?name=cuiyw,就会在点击页面弹出的新页面中看到监控。

微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine

二、Turbine

在复杂的分布式系统中,相同服务的节点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。 为此,Netflix提供了一个开源项目(Turbine)来提供把多个hystrix.stream的内容聚合为一个数据源供Dashboard展示。

1.引入依赖

这里新建了HystrixTurbine项目,在项目中主要引入spring-cloud-starter-netflix-hystrix-dashboard、spring-cloud-starter-netflix-turbine、spring-boot-starter-actuator、spring-cloud-starter-netflix-turbine-stream。

微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.6.RELEASEversion>
        <relativePath/>
    parent>
    <groupId>com.examplegroupId>
    <artifactId>HystrixTurbineartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>HystrixTurbinename>
    <description>Demo project for Spring Bootdescription>
<span>&lt;</span><span>properties</span><span>&gt;</span>
    <span>&lt;</span><span>java.version</span><span>&gt;</span>1.8<span><span>java.version</span><span>&gt;</span>
    <span>&lt;</span><span>spring-cloud.version</span><span>&gt;</span>Greenwich.SR2<span><span>spring-cloud.version</span><span>&gt;</span>
<span><span>properties</span><span>&gt;</span>

<span>&lt;</span><span>dependencies</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.cloud<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-cloud-starter-netflix-hystrix-dashboard<span><span>artifactId</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.cloud<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-cloud-starter-netflix-turbine<span><span>artifactId</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

    <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-starter-test<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>scope</span><span>&gt;</span>test<span><span>scope</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

     <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-starter-actuator<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>2.1.6.RELEASE<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

     <span>&lt;</span><span>dependency</span><span>&gt;</span>
        <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.cloud<span><span>groupId</span><span>&gt;</span>
        <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-cloud-starter-netflix-turbine-stream<span><span>artifactId</span><span>&gt;</span>
        <span>&lt;</span><span>version</span><span>&gt;</span>2.0.1.RELEASE<span><span>version</span><span>&gt;</span>
    <span><span>dependency</span><span>&gt;</span>

<span><span>dependencies</span><span>&gt;</span>

<span>&lt;</span><span>dependencyManagement</span><span>&gt;</span>
    <span>&lt;</span><span>dependencies</span><span>&gt;</span>
        <span>&lt;</span><span>dependency</span><span>&gt;</span>
            <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.cloud<span><span>groupId</span><span>&gt;</span>
            <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-cloud-dependencies<span><span>artifactId</span><span>&gt;</span>
            <span>&lt;</span><span>version</span><span>&gt;</span>${spring-cloud.version}<span><span>version</span><span>&gt;</span>
            <span>&lt;</span><span>type</span><span>&gt;</span>pom<span><span>type</span><span>&gt;</span>
            <span>&lt;</span><span>scope</span><span>&gt;</span>import<span><span>scope</span><span>&gt;</span>
        <span><span>dependency</span><span>&gt;</span>
    <span><span>dependencies</span><span>&gt;</span>
<span><span>dependencyManagement</span><span>&gt;</span>

<span>&lt;</span><span>build</span><span>&gt;</span>
    <span>&lt;</span><span>plugins</span><span>&gt;</span>
        <span>&lt;</span><span>plugin</span><span>&gt;</span>
            <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework.boot<span><span>groupId</span><span>&gt;</span>
            <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-boot-maven-plugin<span><span>artifactId</span><span>&gt;</span>
        <span><span>plugin</span><span>&gt;</span>
    <span><span>plugins</span><span>&gt;</span>
<span><span>build</span><span>&gt;</span>

<span>&lt;</span><span>packaging</span><span>&gt;</span>war<span><span>packaging</span><span>&gt;</span>

project>

View Code

2.设置配置文件

spring.application.name=hystrix-dashboard-turbine
server.port=8002
turbine.appConfig=spring-cloud-consumerA,spring-cloud-consumerB
turbine.aggregator.clusterConfig= default
turbine.clusterNameExpression= new String("default")
eureka.client.serviceUrl.defaultZone=http://localhost:8088/eureka/
spring.main.allow-bean-definition-overriding=true
turbine.instanceUrlSuffix.default =hystrix.stream

turbine.appConfig :配置Eureka中的serviceId列表,表明监控哪些服务
turbine.aggregator.clusterConfig :指定聚合哪些集群,多个使用”,”分割,默认为default。可使用http://…/turbine.stream?cluster={clusterConfig之一}访问
turbine.clusterNameExpression : 1. clusterNameExpression指定集群名称,默认表达式appName;此时:turbine.aggregator.clusterConfig需要配置想要监控的应用名称;2. 当clusterNameExpression: default时,turbine.aggregator.clusterConfig可以不写,因为默认就是default;3. 当clusterNameExpression: metadata[‘cluster’]时,假设想要监控的应用配置了eureka.instance.metadata-map.cluster: ABC,则需要配置,同时turbine.aggregator.clusterConfig: ABC

3.设置@EnableHystrixDashboard、@EnableTurbineStream、 @EnableTurbine

微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.netflix.turbine.EnableTurbine;
import org.springframework.cloud.netflix.turbine.stream.EnableTurbineStream;

@SpringBootApplication
@EnableHystrixDashboard
@EnableTurbineStream
@EnableTurbine
public class HystrixTurbineApplication {

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

View Code

4.测试

分别启动EurekaServer、EurekaClient,分别修改EurekaConsumer,设置端口9001、9002,以及对应的spring.application.name为spring-cloud-consumerA、spring-cloud-consumerB,并启动,最后启动HystrixTurbine。

在浏览器中输入http://localhost:8002/hystrix,在出现的页面中输入http://localhost:8002/turbine.stream ,点击Monitor Stream,在浏览器中分别输入http://localhost:9002/hello?name=cuiywhttp://localhost:9001/hello?name=cuiyw,之后可以观察监控页面。由于这里只有一个接口一个生产者,所以只显示了一个。

微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine

这里还有一个要注意的,由于未在配置文件中设置turbine.instanceUrlSuffix.default =hystrix.stream,导致打开监控页面时一直在loading。日志报com.netflix.turbine.monitor.instance.InstanceMonitor$MisconfiguredHostException: [{“timestamp”:”2019-07-21T14:05:10.222+0000″,”status”:404,”error”:”Not Found”,”message”:”No message available”,”path”:”/actuator/hystrix.stream”}]错误。

微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine

Original: https://www.cnblogs.com/5ishare/p/11222846.html
Author: 社会主义接班人
Title: 微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/542060/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【LEETCODE】76、面试题 08.11. 硬币

    package dynamicprogramming.medium; /** * @Auther: xiaof * @Date: 2020/4/23 09:17 * @Descri…

    Java 2023年6月5日
    071
  • (WebFlux)002、如何打印日志与链路ID

    一、背景 最近在持续改造项目,想通过日志查看用户所有的接口链路日志。在原来基于SpirngMVC的时候,那是比较好处理的,通过ThreadLocal,放入TraceId,就可以把…

    Java 2023年6月15日
    092
  • Mybatis系列全解(三):Mybatis简单CRUD使用介绍

    Mybatis系列全解(三):Mybatis简单CRUD使用介绍 Mybatis系列全解(三):Mybatis简单CRUD使用介绍 – + 前言 Mybaits系列全解…

    Java 2023年6月7日
    074
  • Java理解mian方法

    public static void mian (Sring[ ] args) public :提供给JVM调用的 static:jvm在调用这个方法是,不需要创建对象 void:…

    Java 2023年6月6日
    085
  • SpringBoot扩展配置

    一、配置随机数 RandomValuePropertySource可以用于注入随机数,它支持integer、long、uuid、string。 my.secret=${random…

    Java 2023年5月30日
    066
  • 【声音工厂】微信小程序开发记录 为电台开发的微信小程序 【介绍】

    1.项目背景 因为在电台实习,所以想开发一个专为电台工作的播音员 上传配音的作品的微信小程序,上传的作品有 视频 音频 2.实现的功能有 微信小程序: 播放视频 音频 收藏喜欢的作…

    Java 2023年6月8日
    071
  • nacos 快速入门

    外表可是具有欺骗性的。 No victory comes without a price. 凡是成功就要付出代价。 这个快速开始手册是帮忙您快速在您的电脑上,下载、安装并使用 na…

    Java 2023年6月9日
    0135
  • 关于接口设计的思考–我们真的需要这么多入参吗

    最近,我改造一个旧接口时发现,这个接口有 30 多个入参,而事实上并不需要那么多,而且,这个接口还存在比较大的安全隐患。所以,关于如何设计接口入参,我想谈谈自己的一些想法。 当然,…

    Java 2023年6月14日
    065
  • 基于Redis分布式BitMap的应用

    在实际开发中常常遇到如下需求:判断当前元素是否存在于已知的集合中,将已知集合中的元素维护一个 HashSet,使用时只需耗时 O(1)的时间复杂度便可判断出结果,Java内部或者R…

    Java 2023年6月6日
    088
  • 搞懂nginx的rewrite模块

    https://segmentfault.com/a/1190000008102599 https://xuexb.com/post/nginx-url-rewrite.html …

    Java 2023年5月30日
    068
  • 工厂模式–摆脱你日复一日new对象却依旧单身的苦恼!

    前言 每每谈及到Java,就不免会想到一个悲伤的事实:你是否每天都在new对象,却依然坚守在单身岗上屹立不倒。(所谓面向对象编程的”缺点”hhh),这篇来学…

    Java 2023年6月5日
    070
  • 电脑常见快捷键

    一、键盘功能键: Tab键:切换菜单和空四个格子; Shift键:组合键;(可以与F1,F2,或者1,2,3等等组合打出不一样的符号) Ctrl键:控制键;(eg:ctrl+shi…

    Java 2023年6月15日
    084
  • 线程从2022-06-23 18.21 等待到2022-06-24 11:00

    "task-scheduler-4" #412 prio=5 os_prio=0 tid=0x00007fc5c0017800 nid=0x55d4 in Ob…

    Java 2023年6月9日
    093
  • 一致性 hash 环

    一致性 hash 环 最近做项目 做了一个分发器 ,需要 根据请求携带的参数 把请求分发到 不同的服务器上面,最终我选择使用 一致性hash 环 来实现 ,本篇 就主要讲解一下 一…

    Java 2023年6月9日
    079
  • Linux下搭建maven(maven3.6+nexus3.2)私服

    准备maven和nexus安装包,nexus安装包好像要FQ,不然下载不到! 链接:https://pan.baidu.com/s/1bVMadGoTAK9pSLW6yBNOCg提…

    Java 2023年6月8日
    090
  • Mybatis基本流程及配置文件解析

    Mybatis基本流程 1、利用Resources工具类加载配置文件,并转换成输入输出流 2、利用解析的配置,创建SqlSessionFactory工厂 3、生产SqlSessio…

    Java 2023年6月5日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球