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. Kubernetes将弃用Docker!与 containerd容器引擎

    时间戳:2022-06-07 20:32:19 星期二 撰写文档参考:(阿良-腾讯课堂)Kubernetes将弃用Docker 参考博客k8s入坑之路(3)containerd容器 container ...

  2. sqlserver用windows方式验证登录踩过的坑

    坑位一: 之前没用过windows验证方式登录sqlserver,连接串怎么写 坑位二: 链接上了,但是启动报错 八月 19, 2020 9:33:43 上午 com.microsoft.sqlser ...

  3. Javaweb-pom文件

    pom.xml是maven的核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!--maven版本 ...

  4. 数据库系列:MySQL索引优化总结(综合版)

    1 背景 作为一个常年在一线带组的Owner以及老面试官,我们面试的目标基本都是一线的开发人员.从服务端这个技术栈出发,问题的范围主要还是围绕开发语言(Java.Go)等核心知识点.数据库技术.缓存技 ...

  5. Spring IOC 为什么能降低耦合

    有同学在学习 Spring 框架中可能会问这样的问题,为什么通过依赖注入就可以降低代码间的耦合呢?我通过 new 生产对象不也可以吗,不就是一行代码的不同,一个是 @Resource 注入,一个是 n ...

  6. ansible对文件内容操作

    ansible lineinfile 简介 lineinfile该模块是操作文件中的每一行内容,他是按照行为单位的,和下面的replace模块并不冲突. 修改匹配行,如果不存在就会添加 tasks: ...

  7. Pytorch从0开始实现YOLO V3指南 part2——搭建网络结构层

    本节翻译自:https://blog.paperspace.com/how-to-implement-a-yolo-v3-object-detector-from-scratch-in-pytorch ...

  8. 强化学习-学习笔记8 | Q-learning

    上一篇笔记认识了Sarsa,可以用来训练动作价值函数\(Q_\pi\):本篇来学习Q-Learning,这是另一种 TD 算法,用来学习 最优动作价值函数 Q-star,这就是之前价值学习中用来训练 ...

  9. go 编程规范

    如果没有编程规范会有什么问题? 哪些地方可以需要指定规范? 非编码类规范:编码规范 非编码规范 开源规范 http://www.ruanyifeng.com/blog/2011/05/how_to_c ...

  10. 【.NET基础】Linq常用语法代码演示

    前言:前言不重要,linq入门常用的语法,linq语法可以用来写操作集合.数据库表集合等等几乎所有集合类型的操作.下面就写几个案例(以List集合来做的),看代码和运行结果即可. 本文演示环境:VS2 ...