1. 项目说明

当前这篇教程是:

1. 日志处理

2. 阶段性代码上传博客园

3. Eureka、Config换成Nacos,注册到Nacos,读取Nacos配置

4. Sentinel读取Nacos配置

简单创建一个SpringCloud2021.0.3项目(一)

简单创建一个SpringCloud2021.0.3项目(二)

简单创建一个SpringCloud2021.0.3项目(三)

简单创建一个SpringCloud2021.0.3项目(四)

Sentinel控制台1.8.3修改源码,修改配置后推送到Nacos

1. 版本

  1. SpringCloud版本为2021.0.3
  2. SpringBoot版本为2.7.2

2. 用到组件

  1. 注册中心、配置中心:Nacos
  2. 网关:Gateway
  3. 权限:Security,Gateway集成
  4. 负载均衡:LoadBalancer,SpringCloud2020版之后就集成LoadBalancer
  5. 限流、熔断降级:Sentinel
  6. 服务间访问:Feign

3. 功能

  1. 项目最基本功能,权限控制,在分布式系统中基于Token的身份验证。
  2. 前端登陆,做了2种方式。用户、密码、验证码;邮箱、验证码、图片滑块;并且前端加密传给后端解密;登陆异常次数限制;
  3. 限流、负载均衡,应对高并发情况,降低系统负载;
  4. 服务熔断降级:避免系统雪崩,提高系统可用性;
  5. 两种方式的多数据源,一种是通过AOP方式动态切换数据源,另一种是不同数据源管理的数据各不相同;
  6. 日志系统Logback,是SpringBoot默认集成

2. 上三篇教程

简单创建一个SpringCloud2021.0.3项目(一)

简单创建一个SpringCloud2021.0.3项目(二)

简单创建一个SpringCloud2021.0.3项目(三)

简单创建一个SpringCloud2021.0.3项目(四)

  1. 新建Eureka注册中心
  2. 新建Config配置中心,producerService服务读取参数
  3. 2个业务服务(producerService和webService),webService通过Feign调用producerService的服务
  4. webService用到多数据源,不同的数据源管理不同的数据;security模块测试通过AOP方式动态切换数据源
  5. 抽取公共模块common,集成redis
  6. 新建Gateway网关,集成Security,做登陆和资源权限控制
  7. 前端登陆,做了2种方式。用户、密码、验证码;邮箱、验证码、图片滑块;并且前端加密传给后端解密;登陆异常次数限制
  8. 在分布式系统中基于Token的身份验证
  9. 每次请求刷新用户会话有效时间
  10. Gateway集成Sentinel做限流、熔断降级(超时、异常比例、异常数),集成Sentinel控制台动态配置策略
  11. SpringCloud 2020版之后就集成LoadBalancer,默认是轮询策略。自定义负载均衡策略,比如某台服务器性能好,可以多分配

3. 日志处理

SpringBoot默认集成logback日志框架

1. 创建日志公共模块

  1. pom.xml文件
logCommon的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloud202208</artifactId>
<groupId>com.xiaostudy</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>logCommon</artifactId> </project>
  1. logback-spring.xml配置文件
有注释
<?xml version="1.0" encoding="UTF-8"?>

<!-- 一、根节点<configuration>,包含下面三个属性-->
<!--1.scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true-->
<!--2.scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。-->
<!--3.debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
<configuration scan="true"> <!--注册转换器,颜色转化器。spring默认,自定义logback.xml就加上-->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 二、子节点<property> -->
<!--子节点<property name="" value=""> 用来定义变量值,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量。-->
<!--子节点<property resource=""/> :用来引入外部属性文件,可以使“${}”来使用变量。例如<property resource="logback.properties"/>-->
<!-- <property name="LOG_FILE_NAME" value="kvf-admin-preview"/>-->
<!--取yml里面参数-->
<springProperty scope="context" name="LOG_FILE_NAME" source="spring.application.name" defaultValue="application"/>
<springProperty scope="context" name="LOG_PATH" source="logging.file.path" defaultValue="/tmp/"/>
<!--最大日志级别,yml里面配置-->
<springProperty scope="context" name="MAX_LEVEL" source="logging.level.org.springframework.boot" defaultValue="TRACE"/>
<!--控制台日志级别-->
<springProperty scope="context" name="CONSOLE_LEVEL" source="logging.level.console" defaultValue="TRACE"/>
<!-- 日志文件目录(按环境分) -->
<!-- <springProfile name="dev">
<property name="LOG_PATH" value="D://logs"/>
</springProfile> -->
<!-- <springProfile name="test">-->
<!-- <property name="LOG_PATH" value="/tmp/logs/kvf-admin"/>-->
<!-- </springProfile>-->
<!-- <springProfile name="prod">-->
<!-- <property name="LOG_PATH" value="/tmp/logs/kvf-admin"/>-->
<!-- </springProfile>--> <!-- 文件的保存最大天数 -->
<property name="MAX_HISTORY" value="10"/>
<!-- 文件的最大文件大小 -->
<property name="MAX_FILE_SIZE" value="10MB"/>
<!-- 日志字符编码 -->
<property name="CHARSET" value="UTF-8"/>
<!-- 控制日志是否在控制台打印,默认打印 -->
<property name="IS_OPEN_CONSOLE" value="true"/>
<!--文件info日志级别-->
<property name="FILE_INFO_LEVEL" value="INFO"/>
<!--文件错误日志级别-->
<property name="FILE_ERROR_LEVEL" value="ERROR"/> <!--日志输出格式-->
<!--控制台-彩色-->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p})
%clr(${PID:- }){magenta} %clr(-){faint} %clr([%15.15t]){faint} %clr([%3L]){blue} %clr(%-40.40logger{39})
{cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--文件-黑白-->
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" /> <!-- 三、子节点<contextName>:用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。
但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。-->
<contextName>${springApplicationName}</contextName> <!-- 四、子节点<appender>:负责写日志的组件,它有两个必要属性name和class。
name指定appender名称,class指定appender的全限定名 -->
<!--4.1 class为ch.qos.logback.core.ConsoleAppender 把日志输出到控制台-->
<!--4.2 class为ch.qos.logback.core.FileAppender 把日志添加到文件-->
<!--4.3 class为ch.qos.logback.core.rolling.RollingFileAppender
滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件--> <!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${CONSOLE_LEVEL}</level>
</filter>
<encoder>
<!-- <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>-->
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
<charset>${CHARSET}</charset>
</encoder>
</appender> <!--日志记录器,日期滚动记录,按照每天生成日志文件 -->
<appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE_NAME}_info.log</file>
<!-- 如果true,事件被追加到现存文件尾部。如果false,清空现存文件.默认为true -->
<append>true</append>
<!--临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝-->
<!-- 此日志文件只记录INFO级别的 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${FILE_INFO_LEVEL}</level>
</filter>
<!--当发生滚动时,决定RollingFileAppender的行为-->
<!--日志记录器的滚动策略,按日期,按大小记录,涉及文件移动和重命名-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 归档的日志文件的路径,例如今天是2018-09-21日志,当前写的日志文件路径为file节点指定,
可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
而2018-09-21的归档日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<!--即file和fileNamePattern同时制定,当天日志名由file决定,前一天的文件名将自动改为fileNamePattern的值-->
<!-- 若要加一层时间目录-->
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}_info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--控制被保留的归档文件的最大数量,超出数量就删除旧文件-->
<!--日志文件保留天数 -->
<maxHistory>${MAX_HISTORY}</maxHistory>|
<!--指定文件的大小-->
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
<!-- 日志文件的格式。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${FILE_LOG_PATTERN}</pattern>
<!--日志字符编码格式-->
<charset>${CHARSET}</charset>
</encoder>
</appender> <appender name="FILE-ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE_NAME}_all.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}_all.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${MAX_HISTORY}</maxHistory>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
</appender> <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE_NAME}_error.log</file>
<append>true</append>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}_error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${MAX_HISTORY}</maxHistory>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
</appender> <!-- 五、子节点<logger>:用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。
<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger-->
<!-- <logger name="com.xiaostudy" level="INFO"/>-->
<logger name="org.springframework.boot.web" level="INFO">
<appender-ref ref="CONSOLE" />
</logger> <!-- 六、子节点<root>:它也是<logger>元素,但是它是根logger,是所有<logger>的上级。只有一个level属性,因为name已经被命名为"root",且已经是最上级了。--> <!-- 生产环境下,将此级别配置为适合的级别,以免日志文件太多或影响程序性能 -->
<!--这里改level-->
<root level="${MAX_LEVEL}">
<appender-ref ref="FILE-ALL"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE-INFO"/>
<appender-ref ref="FILE-ERROR"/>
</root> <!--
1. <logger>和<root>至少要有一个,不然不会有任何日志。
2. application配置文件里面logging.level.org.springframework.boot参数配置的等级优先级最高。
如果application里参数为INFO,那么这个日志配置文件里面最大只能控制到INFO级别,TRACE和DEBUG级别的控制不到。
3. <appender><filter><level>的参数配置中等,就低于application配置。
4. 某一个<appender>只使用<logger>而不使用<root>时,<logger>的level参数是指定到包及下所有子包的级别日志,不指定的包是不会打印任何日志。
5. 某一个<appender>同时使用<logger>和<root>时,<logger>的level参数是指定到包及下所有子包的级别日志,不指定的包会根据<appender><filter><level>的参数级别。
6. <root>的level没有任何作用,只是标识方便看。例如可以设置为test可以
--> </configuration>
无注释
<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true">

    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <springProperty scope="context" name="LOG_FILE_NAME" source="spring.application.name" defaultValue="application"/>
<springProperty scope="context" name="LOG_PATH" source="logging.file.path" defaultValue="/tmp/"/>
<springProperty scope="context" name="MAX_LEVEL" source="logging.level.org.springframework.boot" defaultValue="TRACE"/>
<springProperty scope="context" name="CONSOLE_LEVEL" source="logging.level.console" defaultValue="TRACE"/> <property name="MAX_HISTORY" value="10"/>
<property name="MAX_FILE_SIZE" value="10MB"/>
<property name="CHARSET" value="UTF-8"/>
<property name="IS_OPEN_CONSOLE" value="true"/>
<property name="FILE_INFO_LEVEL" value="INFO"/>
<property name="FILE_ERROR_LEVEL" value="ERROR"/> <property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p})
%clr(${PID:- }){magenta} %clr(-){faint} %clr([%15.15t]){faint} %clr([%3L]){blue} %clr(%-40.40logger{39})
{cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" /> <contextName>${springApplicationName}</contextName> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${CONSOLE_LEVEL}</level>
</filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
</appender> <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE_NAME}_info.log</file>
<append>true</append>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${FILE_INFO_LEVEL}</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}_info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${MAX_HISTORY}</maxHistory>|
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
</appender> <appender name="FILE-ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE_NAME}_all.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}_all.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${MAX_HISTORY}</maxHistory>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
</appender> <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE_NAME}_error.log</file>
<append>true</append>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}_error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${MAX_HISTORY}</maxHistory>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
</appender> <logger name="org.springframework.boot.web" level="INFO">
<appender-ref ref="CONSOLE" />
</logger> <root level="${MAX_LEVEL}">
<appender-ref ref="FILE-ALL"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE-INFO"/>
<appender-ref ref="FILE-ERROR"/>
</root> </configuration>
  1. 配置文件application-log.yml
点击查看代码
logging:
file:
# 存放日志文件及文件名称。相对路径是从父模块目录开始,例如父模块目录为E:/my_code/SpringCloud202208,那么下面就等同于绝对路径E:/my_code/SpringCloud202208/logs/${spring.application.name}
# path: logs/${spring.application.name}
path: E:/my_code/SpringCloud202208/logs/${spring.application.name}
level:
org:
springframework:
# 日志级别TRACE、DEBUG、INFO、WARN和ERROR,这个优先级最高,大于日志配置文件里面配置的
boot: ${log.level}
# 控制台日志级别,logback-spring.xml用到参数
console: ${log.level}

2. Eureka引入日志模块

  1. 添加依赖

<dependency>
<groupId>com.xiaostudy</groupId>
<artifactId>logCommon</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
  1. 配置文件配置参数

此时的配置文件
server:
port: '@eureka.port@' eureka:
url-name: '@eureka.url.name@'
instance:
hostname: '@eureka.ip@'
# 每隔这个时间会主动心跳一次,默认值为30s
leaseRenewalIntervalInSeconds: 25
server:
# 自我保护机制,默认权重0.85。默认情况下会报警告,资料:https://blog.csdn.net/hadues/article/details/105023709
renewalPercentThreshold: 0.49
client:
# 声明是否将自己的信息注册到Eureka服务器上
registerWithEureka: false
# 是否到Eureka服务器中抓取注册信息
fetchRegistry: false
serviceUrl:
defaultZone: http://@eureka.user.name@:@eureka.user.password@@${eureka.instance.hostname}:${server.port}/${eureka.url-name}/ spring:
application:
name: '@eureka.application.name@'
security:
user:
name: '@eureka.user.name@'
password: '@eureka.user.password@'
profiles:
# 使用的配置文件后缀application-log.yml
active: log log:
# level: DEBUG
level: INFO
  1. 启动Eureka



4. 到此的功能代码

https://files.cnblogs.com/files/xiaostudy/SpringCloud202208.7z?t=1661694659

5. 注册中心换成nacos

1. 下载安装

GitHub地址:https://github.com/alibaba/nacos/releases/2.1.1

下载2.1.1版本:https://github.com/alibaba/nacos/releases/download/2.1.1/nacos-server-2.1.1.zip

找一个库,执行/conf/nacos-mysql.sql,这里用test_nacos库

设置/conf/application.properties数据库信息、开启密码验证



设置单机启动,不是集群的话,这里演示只用单机



启动nacos

登陆

修改密码

2. 添加命名空间

6. Gateway修改为注册在nacos

  1. 修改依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
  1. 父模块添加参数

此时父模块的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
<relativePath/>
</parent> <groupId>com.xiaostudy</groupId>
<artifactId>SpringCloud202208</artifactId>
<version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules>
<module>eureka</module>
<module>config</module>
<module>producerService</module>
<module>feign</module>
<module>webService</module>
<module>common</module>
<module>security</module>
<module>gateway</module>
<module>logCommon</module>
</modules> <properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target> <java.version>1.8</java.version>
<spring-cloud.version>2021.0.3</spring-cloud.version> <eureka.application.name>EUREKA-SERVICE</eureka.application.name>
<eureka.ip>localhost</eureka.ip>
<eureka.port>9900</eureka.port>
<eureka.url.name>eureka</eureka.url.name>
<eureka.user.name>admin</eureka.user.name>
<eureka.user.password>xiaostudy.test</eureka.user.password> <nacos.ip>localhost</nacos.ip>
<nacos.port>8848</nacos.port>
<gateway.group>gateway</gateway.group>
<nacos.namespace>test</nacos.namespace>
<package.environment>lw</package.environment>
<nacos.username>nacos</nacos.username>
<nacos.password>xiaostudy.test</nacos.password> <config.application.name>CONFIG-SERVICE</config.application.name>
<config.port>9901</config.port> <gateway.application.name>GATEWAY-SERVICE</gateway.application.name>
<gateway.port>9904</gateway.port>
<gateway.version>3.1.3</gateway.version> <producer.application.name>PRODUCER-SERVICE</producer.application.name>
<producer.port>9902</producer.port> <web.application.name>WEB-SERVICE</web.application.name>
<web.port>9903</web.port> <sentinel.version>2021.0.1.0</sentinel.version>
<nacos.version>2021.0.1.0</nacos.version>
<sentinel.port>9909</sentinel.port> <!-- <spring.profiles.active>dev</spring.profiles.active>-->
<spring.profiles.active>prod</spring.profiles.active>
</properties> <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-maven-plugin</artifactId>
<version>${parent.version}</version>
</dependency>
</dependencies>
</dependencyManagement> </project>
  1. 修改配置文件

点击查看代码
server:
port: '@gateway.port@' spring:
application:
name: '@gateway.application.name@'
cloud:
nacos:
discovery:
server-addr: @nacos.ip@:@nacos.port@
service: ${spring.application.name}
group: '@gateway.group@'
namespace: '@nacos.namespace@-@package.environment@'
username: '@nacos.username@'
password: '@nacos.password@'
loadbalancer:
retry:
# 关闭重试
enabled: false
gateway:
routes:
# 路由的id,没有规定规则但要求唯一,建议配合服务名
- id: '@producer.application.name@'
# 匹配后提供服务的路由地址,LoadBalancer做负载均衡
uri: lb://@producer.application.name@
predicates:
# 断言,路径相匹配的进行路由
- Path=/producer/**
filters:
# 去掉url一级前缀,例如http://localhost:9904/producer/producerTest/getByName,等同于http://localhost:9901/producerTest/getByName
- StripPrefix=1
- id: '@web.application.name@'
uri: lb://@web.application.name@
predicates:
- Path=/web/**
filters:
- StripPrefix=1
sentinel:
# 服务启动直接建立心跳连接,饿汉式
eager: true
filter:
# 手动注入Sentinel的过滤器,关闭Sentinel注入CommonFilter实例
enabled: false
# 限流时,自定义返回内容
scg:
fallback:
response-body: '{"code":200,"status":1,"msg":"服务器暂不可用啦!"}'
mode: response
response-status: 200
transport:
# 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer。如果端口被占用会往后+1,直到没有占用
port: '@sentinel.port@'
dashboard: localhost:9910
redis:
host: localhost
port: 6379
# 默认0
database: 1
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制),默认值:8
max-active: 20
# 连接池中的最大空闲连接,默认值:8
max-idle: 10
# 连接池中的最小空闲连接,默认值:0
min-idle: 1
# 连接池最大阻塞等待时间(使用负值表示没有限制),默认值:-1,单位:毫秒
max-wait: 2000 profiles:
# 使用的配置文件后缀application-security.yml。一个或多个,中间英文逗号分开
active: security
web:
application:
name: '@web.application.name@'
  1. 启动



7. 从nacos读取配置文件

  1. 把gateway需要的文件放上去

  2. gateway添加依赖

  3. 修改配置文件

点击查看代码
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
service: gateway-service
group: gateway
namespace: test-lw
username: nacos
password: xiaostudy.test
config:
server-addr: localhost:8848
namespace: test-lw
# 使用nacos的配置中心配置覆盖本地配置
enabled: true
username: nacos
password: xiaostudy.test
# 读取单个
# file-extension: yml
# group: test
# prefix: gateway
# 读取多个
extension-configs:
- data-id: gateway.yml
group: test
- data-id: security.yml
group: test
  1. 重启

  2. 其他的同样,就不一一说明了,先放nacos的配置文件,分组都是test

gateway.yml
server:
port: 9904 spring:
application:
name: gateway-service
cloud:
loadbalancer:
retry:
# 关闭重试
enabled: false
gateway:
routes:
# 路由的id,没有规定规则但要求唯一,建议配合服务名
- id: producer-service
# 匹配后提供服务的路由地址,LoadBalancer做负载均衡
uri: lb://producer-service
predicates:
# 断言,路径相匹配的进行路由
- Path=/producer/**
filters:
# 去掉url一级前缀,例如http://localhost:9904/producer/producerTest/getByName,等同于http://localhost:9901/producerTest/getByName
- StripPrefix=1
- id: web-service
uri: lb://web-service
predicates:
- Path=/web/**
filters:
- StripPrefix=1
sentinel:
# 服务启动直接建立心跳连接,饿汉式
eager: true
filter:
# 手动注入Sentinel的过滤器,关闭Sentinel注入CommonFilter实例
enabled: false
# 限流时,自定义返回内容
scg:
fallback:
response-body: '{"code":200,"status":1,"msg":"服务器暂不可用啦!"}'
mode: response
response-status: 200
transport:
# 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer。如果端口被占用会往后+1,直到没有占用
port: 9909
dashboard: localhost:9910
redis:
host: localhost
port: 6379
# 默认0
database: 1
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制),默认值:8
max-active: 20
# 连接池中的最大空闲连接,默认值:8
max-idle: 10
# 连接池中的最小空闲连接,默认值:0
min-idle: 1
# 连接池最大阻塞等待时间(使用负值表示没有限制),默认值:-1,单位:毫秒
max-wait: 2000 web:
application:
name: web-service
server:
port: 9904 spring:
application:
name: gateway-service
cloud:
loadbalancer:
retry:
# 关闭重试
enabled: false
gateway:
routes:
# 路由的id,没有规定规则但要求唯一,建议配合服务名
- id: producer-service
# 匹配后提供服务的路由地址,LoadBalancer做负载均衡
uri: lb://producer-service
predicates:
# 断言,路径相匹配的进行路由
- Path=/producer/**
filters:
# 去掉url一级前缀,例如http://localhost:9904/producer/producerTest/getByName,等同于http://localhost:9901/producerTest/getByName
- StripPrefix=1
- id: web-service
uri: lb://web-service
predicates:
- Path=/web/**
filters:
- StripPrefix=1
sentinel:
# 服务启动直接建立心跳连接,饿汉式
eager: true
filter:
# 手动注入Sentinel的过滤器,关闭Sentinel注入CommonFilter实例
enabled: false
# 限流时,自定义返回内容
scg:
fallback:
response-body: '{"code":200,"status":1,"msg":"服务器暂不可用啦!"}'
mode: response
response-status: 200
transport:
# 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer。如果端口被占用会往后+1,直到没有占用
port: 9909
dashboard: localhost:9910
redis:
host: localhost
port: 6379
# 默认0
database: 1
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制),默认值:8
max-active: 20
# 连接池中的最大空闲连接,默认值:8
max-idle: 10
# 连接池中的最小空闲连接,默认值:0
min-idle: 1
# 连接池最大阻塞等待时间(使用负值表示没有限制),默认值:-1,单位:毫秒
max-wait: 2000 web:
application:
name: web-service log:
# level: DEBUG
level: INFO
security.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8
username: root
password: 密码
druid2:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=utf8
username: root
password: 密码
mail:
default-encoding: UTF-8
# 阿里云发送服务器地址
host: smtp.mxhichina.com
# 发送人地址
username: liwei@xiaostudy.com
# 密码
password: ENC(密钥)
properties:
mail:
smtp:
starttls:
enable: true
required: true
auth: true
socketFactory:
class: javax.net.ssl.SSLSocketFactory
port: 465
jasypt:
encryptor:
password: 密码
mybatis:
configuration:
# 下划线转驼峰
map-underscore-to-camel-case: true
# 注册映射文件
mapper-locations: mapper/*Mapper.xml
# 注册实体类别名
type-aliases-package: com.xiaostudy.security.entity session:
# session过期时间,单位秒
timeout: 1800
# timeout: 30
producer.yml
server:
port: 9902
spring:
application:
name: producer-service
cloud:
loadbalancer:
retry:
# 关闭重试
enabled: false
my:
test: nacos-test
web-feign.yml
producer:
application:
name: producer-service
gateway:
application:
name: gateway-service
feign:
client:
config:
default:
# 默认1000
connect-timeout: 5000
read-timeout: 5000
web.yml
server:
port: 9903
spring:
application:
name: web-service
cloud:
loadbalancer:
retry:
# 关闭重试
enabled: false
sentinel:
transport:
# 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer。如果端口被占用会往后+1,直到没有占用
port: 9909
dashboard: localhost:9910
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8
username: root
password: 密码
druid2:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=utf8
username: root
password: 密码
druid3:
driverClassName: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@//localhost:1521/ORCL
username: lw
password: 密码
redis:
host: localhost
port: 6379
# 默认0
database: 1
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制),默认值:8
max-active: 20
# 连接池中的最大空闲连接,默认值:8
max-idle: 10
# 连接池中的最小空闲连接,默认值:0
min-idle: 1
# 连接池最大阻塞等待时间(使用负值表示没有限制),默认值:-1,单位:毫秒
max-wait: 2000 my:
gateway:
ip: localhost
port: 9904
logback.yml
logging:
file:
# 存放日志文件及文件名称。相对路径是从父模块目录开始,例如父模块目录为E:/my_code/SpringCloud202208,那么下面就等同于绝对路径E:/my_code/SpringCloud202208/logs/${spring.application.name}
# path: logs/${spring.application.name}
path: E:/my_code/SpringCloud202208/logs/${spring.application.name}
level:
org:
springframework:
# 日志级别TRACE、DEBUG、INFO、WARN和ERROR,这个优先级最高,大于日志配置文件里面配置的
boot: ${log.level}
# 控制台日志级别,logback-spring.xml用到参数
console: ${log.level}
gateway的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>
<parent>
<groupId>com.xiaostudy</groupId>
<artifactId>SpringCloud202208</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway</name>
<description>gateway</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${nacos.version}</version>
</dependency>
<!--SpringCloud 2020.*以后的版本默认禁用了bootstrap,导致读取配置文件时读取不到该属性-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency> <dependency>
<groupId>com.xiaostudy</groupId>
<artifactId>security</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.xiaostudy</groupId>
<artifactId>logCommon</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency> <!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${sentinel.version}</version>
</dependency>
<!-- SpringCloud Alibaba Sentinel Gateway -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
<version>${sentinel.version}</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
gateway的本地bootstrap.yml文件
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
service: gateway-service
group: groupTest
namespace: test-lw
username: nacos
password: xiaostudy.test
config:
server-addr: localhost:8848
namespace: test-lw
# 使用nacos的配置中心配置覆盖本地配置
enabled: true
username: nacos
password: xiaostudy.test
# 读取单个
# file-extension: yml
# group: test
# prefix: gateway
# 读取多个
extension-configs:
- data-id: gateway.yml
group: test
- data-id: security.yml
group: test
- data-id: logback.yml
group: test
producer的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>
<parent>
<groupId>com.xiaostudy</groupId>
<artifactId>SpringCloud202208</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>producerService</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>producerService</name>
<description>producerService</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringCloud 2020.*以后的版本默认禁用了bootstrap,导致读取配置文件时读取不到该属性-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
producer的本地bootstrap.yml文件
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
service: producer-service
group: groupTest
namespace: test-lw
username: nacos
password: xiaostudy.test
config:
server-addr: localhost:8848
namespace: test-lw
# 使用nacos的配置中心配置覆盖本地配置
enabled: true
username: nacos
password: xiaostudy.test
# 读取多个
extension-configs:
- data-id: producer.yml
group: test
web的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>
<parent>
<groupId>com.xiaostudy</groupId>
<artifactId>SpringCloud202208</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.xiaostudy</groupId>
<artifactId>webService</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>webService</name>
<description>webService</description>
<dependencies>
<!--SpringCloud 2020.*以后的版本默认禁用了bootstrap,导致读取配置文件时读取不到该属性-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency> <dependency>
<groupId>com.xiaostudy</groupId>
<artifactId>feign</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency> <!-- druid数据源驱动 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<!--MySQL-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> <!-- Oracle -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>com.xiaostudy</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency> <!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${sentinel.version}</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
web的本地bootstrap.yml文件
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
service: web-service
group: groupTest
namespace: test-lw
username: nacos
password: xiaostudy.test
config:
server-addr: localhost:8848
namespace: test-lw
# 使用nacos的配置中心配置覆盖本地配置
enabled: true
username: nacos
password: xiaostudy.test
# 读取多个
extension-configs:
- data-id: web.yml
group: test
- data-id: web-feign.yml
group: test



8. Sentinel配置放nacos,单向,nacos配置Sentinel读取

1. nacos上配置限流和熔断降级

  1. 限流,组是test,文件格式json
gateway-service-sentinel.json
[
{
"resource": "web-service",
"limitApp": "default",
"grade": 1,
"count": 6,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
  1. 熔断降级,这里设置超时
gateway-service-sentinel-degrade.json
[
{
"count":1,
"grade":0,
"limitApp":"default",
"minRequestAmount":1,
"resource":"/webUser/getProducerTest",
"slowRatioThreshold":1,
"statIntervalMs":1000,
"timeWindow":10
}
]

2. gateway服务修改

  1. 添加依赖

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.3</version>
</dependency>
  1. 本地配置文件修改

点击查看代码
spring:
cloud:
sentinel:
# Map类型,key随便定
datasource:
# 限流
lw1:
nacos:
username: nacos
password: xiaostudy.test
# nacos地址
server-addr: localhost:8848
# 命名空间
namespace: test-lw
# nacos中配置文件的data-id
data-id: ${spring.application.name}-sentinel.json
# nacos 分组
group-id: test
# 规则类型 流控
rule-type: flow
# 降级
lw2:
nacos:
username: nacos
password: xiaostudy.test
server-addr: localhost:8848
namespace: test-lw
data-id: ${spring.application.name}-sentinel-degrade.json
group-id: test
rule-type: degrade

3. 重启gateway服务





4. 测试

  1. 测超时熔断





  2. 测限流







简单创建一个SpringCloud2021.0.3项目(四)的更多相关文章

  1. 简单创建一个SpringCloud2021.0.3项目(三)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上俩篇教程 3. Gateway集成sentinel,网关层做熔断降级 1. 超时熔断降级 2. 异常熔断 3. 集成sentine ...

  2. 简单创建一个SpringCloud2021.0.3项目(二)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上一篇教程 3. 创建公共模块Common 4. 网关Gateway 1. 创建Security 2. Security登陆配置 3 ...

  3. 简单创建一个SpringCloud2021.0.3项目(一)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 新建父模块和注册中心 1. 新建父模块 2. 新建注册中心Eureka 3. 新建配置中心Config 4. 新建两个业务服务 1. ...

  4. 【Vue-Cli3.0】【1】创建一个Vue-Cli3.0的项目

    最近在做爬虫,然后要爬好多数据,代码写完了,就让它在爬了.不想闲着就复习一下Vue吧! 开始开始! ***正式讲解之前 先下载一个node.js吧! 一.首先检查一下 版本 PS D:\徐孟林\D D ...

  5. 通过beego快速创建一个Restful风格API项目及API文档自动化

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  6. 通过beego快速创建一个Restful风格API项目及API文档自动化(转)

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  7. 如何使用maven建一个web3.0的项目

    使用eclipse手动建一个maven的web project可能会有版本不合适的情况,例如使用spring的websocket需要web3.0什么的,不全面的修改可能会出现各种红叉,甚是苦恼.我从我 ...

  8. 以sb7code为基础创建一个基本的OpenGL项目

      以sb7code为基础创建一个基本的OpenGL项目   从github上面下载sb7code代码: https://github.com/openglsuperbible/sb7code 打开H ...

  9. 简单创建一个完整的struts2框架小程序

    要完成一个struts2框架的搭建, 1.首先应该从官网上下载最新的jar包,网络连接:http://struts.apache.org/download.cgi#struts2514.1,选择下载F ...

随机推荐

  1. 修改SQL Server用户的密码-使用SSMS

    更新日志 2022年6月13日 发布文章. 2022年5月21日 开始文章. 打开软件Microsoft SQL Server Management Studio(简写:SSMS). 登录连接具体的数 ...

  2. Markdown常见基本语法

    标题 -方式一:使用警号 几个警号就是几级标题,eg: # 一级标题 -方式二: 使用快捷键 ctrl+数字 几级标题就选其对应的数字, eg: ctrl+2(二级标题) 子标题 -方式一: 使用星号 ...

  3. 我熬夜开发了一款简约实用、支持多平台的Markdown在线编辑器(开源)

    前言 之前,一直想开发一款属于自己的Markdown编辑器,主要是自己平常写文章可以更加灵活操作,另外扩宽自己的视野也是非常不错的选择啊!所以在周末就决定玩耍一番.首先我调研了很多线上热门的md编辑器 ...

  4. 使用dnSpy对无源码EXE或DLL进行反编译并且修改

    背景 总有一些特殊情况,我们没有源码,但是某个C#程序集dll或者可执行程序exe影响到我们代码的正常运行,我们希望得到源码,能改掉或者修改某些bug,但是苦于没有源码,这个时候可以用dnspy进行源 ...

  5. linux 文件名乱码的文件无法删除

    1.通过ls -i命令获得文件的节点号 2.通过节点号删除 find -inum 节点号 -delete 这样就可以删除文件名乱码的文件

  6. Ubuntu 隐藏所有窗口快捷键不生效问题

    在绑定界面卡住时,切换到一个tty窗口,再切回来 gsettings reset-recursively org.gnome.settings-daemon.plugins.media-keys gs ...

  7. Scala的基础用法 和 Java相对应学习(二)变量、循环、语法

    一.配置相关环境 1.增加项目 在idea里面创建新的maven项目 2. 在pom文件中增加依赖 <?xml version="1.0" encoding="UT ...

  8. Centos7中配置NIS:用户账号管理

    NIS:网络信息服务 Linux系统中用户按地域分两类:本地用户,远程用户(NIS.LDAP.AD)模式:C/S模式 ypbind是定义NIS服务器的客户端进程,一旦确定了服务器位置,客户端绑定到了服 ...

  9. C# 委托/事件本质详解

    委托 一.什么是委托 IL层面1>委托的本质就是一个类2>继承自System.MulticastDelegate3>委托里面内置了3个方法:Invoke(),BeginInvoke( ...

  10. flex 我所理解不够深刻的内容

    1.align-items属性   父元素 align-items属性定义项目在交叉轴上如何对齐. flex-start:交叉轴的起点对齐. flex-end:交叉轴的终点对齐. center:交叉轴 ...