基于SpringCloud搭建新生电子报道系统
根据要求将新生电子报道系统由SpringBoot拆分为SpringCloud,只做架构的修改,不涉及业务源码修改。
1、技术栈选型
技术栈 | 功能/版本 |
---|---|
Spring Boot | 2.2.5.RELEASE |
Spring Cloud | Hoxton.SR6 |
Spring Cloud Alibaba | 2.1.2.RELEASE |
Nacos | 注册中心,配置中心 |
OpenFeign | 远程调用 |
Gateway | 网关,请求分发,统一拦截 |
Sentinel | 服务限流,熔断监控 |
Seata | 分布式事务 |
Zipkin + Sleuth | 链路追踪 |
Spring Boot Admin | 状态监控 |
ELK | 日志分析解决方案 |
2、模块划分
electronic-registration-cloud
├── erc-admin -- 业务:管理员模块 [8005]
├── erc-common -- 系统公共模块
├── erc-data -- 业务:大屏模块 [9001]
├── erc-gateway -- Spring Cloud Gateway网关 [9527]
├── erc-monitor -- Spring Boot Admin 服务状态监控 [8769]
├── erc-openid -- 业务:微信模块[8003]
├── erc-praise -- 业务:喜报模块 [8004]
├── erc-healthinfo -- 业务:健康码模块[8006]
└── erc-student -- 业务:用户模块 [8001]
3、基本服务搭建
3.1、Nacos
参考:https://blog.csdn.net/su2231595742/article/details/122827205?spm=1001.2014.3001.5502
3.2、sentinel dashboard的安装
普通安装
1、下载 https://github.com/alibaba/Sentinel/releases
2、启动
- 仪表盘是个jar包可以直接通过java命令启动 如: java -jar 方式运行 默认端口为 8858
- java -jar sentinel-dashboard-1.7.2.jar
3、访问web界面 http://localhost:8858/
- 用户名&密码: sentinel
注:这种启动方式要一直终端窗口开启
Docker方式安装
# 1. 搜索镜像
docker search sentinel-dashboard
# 2. 拉取镜像
docker pull bladex/sentinel-dashboard
# 3. 查看端口
docker inspect sentinel-dashboard
发现默认暴露端口为8719、8858
# 4. 启动
docker run --name sentinel -d -p 8858:8858 -p 8719:8719 -d bladex/sentinel-dashboard
3.3、Zipkin
docker方式安装
docker search zipin
docker pull openzipkin/zipkin
docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin
普通方式安装(要求jdk 1.8+环境)
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
使用mysql实现数据持久化
1、创建mysql数据环境
CREATE TABLE IF NOT EXISTS zipkin_spans (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL,
`id` BIGINT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`parent_id` BIGINT,
`debug` BIT(1),
`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
CREATE TABLE IF NOT EXISTS zipkin_annotations (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';
CREATE TABLE IF NOT EXISTS zipkin_dependencies (
`day` DATE NOT NULL,
`parent` VARCHAR(255) NOT NULL,
`child` VARCHAR(255) NOT NULL,
`call_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);
2、在启动ZipKin Server的时候,指定数据保存的mysql的信息
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=123456
docker方式
docker run --name zipkin -d \
-p 9411:9411 \
-e STORAGE_TYPE=mysql \
-e MYSQL_HOST=127.0.0.1 \
-e MYSQL_TCP_PORT=3306 \
-e MYSQL_DB=zipkin \
-e MYSQL_USER=root \
-e MYSQL_PASS=123456 \
openzipkin/zipkin
3.4、seata安装
https://blog.csdn.net/su2231595742/article/details/124515517?spm=1001.2014.3001.5501
4、项目搭建
4.1、父工程
<?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>
<groupId>com.marchsoft</groupId>
<artifactId>electronic-registration-cloud</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>erc-admin</module>
<module>erc-common</module>
<module>erc-data</module>
<module>erc-gateway</module>
<module>erc-monitor</module>
<module>erc-openid</module>
<module>erc-praise</module>
<module>erc-student</module>
<module>erc-healthinfo</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.2.RELEASE</spring-cloud-alibaba.version>
<spring.boot.admin.version>2.3.0</spring.boot.admin.version>
<mysql.connector.java.version>8.0.12</mysql.connector.java.version>
<druid.version>1.1.22</druid.version>
<mybatis.plus.version>3.3.2</mybatis.plus.version>
<log4jdbc.version>1.16</log4jdbc.version>
<logstash-logback-encoder.version>6.6</logstash-logback-encoder.version>
<velocity.version>2.2</velocity.version>
<hutool.version>5.2.5</hutool.version>
<mysql.version>8.0.12</mysql.version>
<swagger.version>2.9.2</swagger.version>
<swagger-annotations.version>1.5.21</swagger-annotations.version>
<swagger-models.version>1.5.21</swagger-models.version>
</properties>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.2.5.RELEASE</version>
</parent>
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>${spring.boot.admin.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.connector.java.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- mybatis plus相关 start -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity.version}</version>
</dependency>
<!-- mybatis plus相关 end -->
<!--接口文档-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger-annotations.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger-models.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>${logstash-logback-encoder.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<!--监控sql日志(对使用了占位符的sql输出是没有显示完整的sql语句)-->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>${log4jdbc.version}</version>
</dependency>
<!--工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
</configuration>
</plugin>
<!-- 跳过单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.2、网关模块
pom依赖
<?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>electronic-registration-cloud</artifactId>
<groupId>com.marchsoft</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>erc-gateway</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
</dependencies>
</project>
配置文件
为了方便代码阅读,暂未使用config配置中心
bootstrap.yml
spring:
application:
name: ERC-GATEWAY
cloud:
nacos:
server-addr: 192.168.199.129:8848
discovery:
server-addr: ${spring.cloud.nacos.server-addr}
application.yml
spring:
profiles:
active: dev
application-dev.yml
server:
port: 8080
server-ip-addr: 192.168.199.129
spring:
application:
name: ERC-GATEWAY
# sleuth:
# sampler:
# probability: 1.0
# zipkin:
# base-url: http://${server-ip-addr}:9411
# discovery-client-enabled: false
cloud:
nacos:
server-addr: ${server-ip-addr}:8848
discovery:
server-addr: ${spring.cloud.nacos.server-addr}
sentinel:
transport:
dashboard: ${server-ip-addr}:8858
port: 8719
# nacos配置持久化
datasource:
ds1:
nacos:
server-addr: ${spring.cloud.nacos.server-addr}
dataId: sentinel-gateway
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
globalcors:
cors-configurations:
'[/**]':
allow-credentials: true
allowed-origins: "*"
allowed-headers: "*"
allowed-methods:
- OPTIONS
- GET
- POST
- DELETE
- PUT
routes:
- id: admin_route
uri: lb://ERC-ADMIN
predicates:
- Path=/api/admin/**
- id: openid_route
uri: lb://ERC-OPENID
predicates:
- Path=/api/openid/**
- id: students_route
uri: lb://ERC-STUDENT
predicates:
- Path=/api/students/**
- id: praise_route
uri: lb://ERC-PRAISE
predicates:
- Path=/api/praise/**
- id: data_route
uri: lb://ERC-DATA
predicates:
- Path=/api/data/**
- id: healthinfo_route
uri: lb://ERC-HEALTHINFO
predicates:
- Path=/api/healthInfo/**
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
token:
startWith: marchsoft-
requestHeader: Authorization
swagger:
enabled: true
host: 127.0.0.1:${server.port}
descrserver-ip-addrtion: 一个简单且易上手的 Spring boot 后台管理框架
title: SMPE-ADMIN 接口文档
version: @project.version@
4.3、监控模块
pom依赖
<?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>electronic-registration-cloud</artifactId>
<groupId>com.marchsoft</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>erc-monitor</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- SpringCloud alibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
</project>
配置文件
application.yml
spring:
profiles:
active: dev
application-dev.yml
server:
port: 8769
server-ip-addr: 192.168.199.129
spring:
application:
name: ERC-MONITOR
cloud:
nacos:
discovery:
server-addr: ${server-ip-addr}:8848
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
启动类
@EnableAdminServer
@Configuration
@EnableDiscoveryClient
@EnableAutoConfiguration
public class MonitorApplication {
public static void main(String[] args) {
SpringApplication.run(MonitorApplication.class, args);
}
@Configuration
public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll()
.and().csrf().disable();
}
}
}
安全配置
@Configuration(proxyBeanMethods = false)
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final AdminServerProperties adminServer;
private final SecurityProperties security;
public SecuritySecureConfig(AdminServerProperties adminServer, SecurityProperties security) {
this.adminServer = adminServer;
this.security = security;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(adminServer.path("/"));
http.authorizeRequests(
(authorizeRequests) -> authorizeRequests.antMatchers(adminServer.path("/assets/**")).permitAll() // 授予对所有静态资产和登录页面的公共访问权限。
.antMatchers(adminServer.path("/actuator/info")).permitAll()
.antMatchers(adminServer.path("/actuator/health")).permitAll()
.antMatchers(adminServer.path("/login")).permitAll().anyRequest().authenticated() //必须对所有其他请求进行身份验证。
).formLogin(
(formLogin) -> formLogin.loginPage(adminServer.path("/login")).successHandler(successHandler).and() //配置登录和注销。
).logout((logout) -> logout.logoutUrl(adminServer.path("/logout"))).httpBasic(Customizer.withDefaults()) //启用 HTTP 基本支持。这是 Spring Boot Admin Client 注册所必需的。
.csrf((csrf) -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) //使用 Cookie 启用 CSRF 保护
.ignoringRequestMatchers(
new AntPathRequestMatcher(adminServer.path("/instances"),
HttpMethod.POST.toString()),
new AntPathRequestMatcher(adminServer.path("/instances/*"), // 为 Spring Boot Admin Client 用于(取消)注册的端点禁用 CSRF 保护。
HttpMethod.DELETE.toString()),
new AntPathRequestMatcher(adminServer.path("/actuator/**")) // 禁用执行器端点的 CSRF 保护。
))
.rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));
}
// Required to provide UserDetailsService for "remember functionality"
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser(security.getUser().getName())
.password("{noop}" + security.getUser().getPassword()).roles("USER");
}
}
4.4、业务模块
以 erc-admin 为例,其他模块配置基本一致
pom依赖
<?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>electronic-registration-cloud</artifactId>
<groupId>com.marchsoft</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>erc-admin</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.marchsoft</groupId>
<artifactId>erc-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--引入sentinel依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-sleuth</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
</dependencies>
</project>
配置文件
spring:
application:
name: ERC-ADMIN
cloud:
nacos:
server-addr: 192.168.199.129:8848
discovery:
server-addr: ${spring.cloud.nacos.server-addr}
application.yml
spring:
profiles:
active: dev
---
server:
port: 8005
server-ip-addr: 192.168.199.129
spring:
application:
name: ERC-ADMIN
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: Asia/Shanghai
datasource:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/electroic_registration?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
username: root
password: 123456
hikari:
max-lifetime: 60000
maximum-pool-size: 30
minimum-idle: 10
idle-timeout: 30000
cloud:
nacos:
server-addr: ${server-ip-addr}:8848
discovery:
server-addr: ${spring.cloud.nacos.server-addr}
sentinel:
enabled: true
transport:
dashboard: ${server-ip-addr}:8858
port: 8719
datasource:
ds1:
nacos:
server-addr: ${spring.cloud.nacos.server-addr}
dataId: ${spring.application.name}
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
alibaba:
seata:
tx-service-group: ${spring.application.name}
sleuth:
sampler:
probability: 1.0
zipkin:
base-url: http://${server-ip-addr}:9411
discovery-client-enabled: false
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: my_test_tx_group # 事务分组 对应config.txt的service.vgroupMapping.my_test_tx_group=default 默认AT
enable-auto-data-source-proxy: true # 开启数据源自动代理
registry: #registry根据seata服务端的registry配置
type: nacos
nacos:
server-addr: ${spring.cloud.nacos.server-addr}
namespace:
group: SEATA_GROUP
username: nacos
password: nacos
config:
type: nacos
nacos:
server-addr: ${spring.cloud.nacos.server-addr}
namespace:
group: SEATA_GROUP
username: nacos
password: nacos
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
#logging:
# config: classpath:logback/logback-${spring.profiles.active}.xml
#logstash:
# destination: 127.0.0.1:5064
token:
startWith: marchsoft-
requestHeader: Authorization
swagger:
enabled: true
host: 127.0.0.1:${server.port}
descrserver-ip-addrtion: 一个简单且易上手的 Spring boot 后台管理框架
title: SMPE-ADMIN 接口文档
version: @project.version@
服务调用
@FeignClient("ERC-STUDENT")
@RequestMapping("/students")
public interface StudentClient {
@GetMapping("/selectListById/{id}")
List<Students> selectListById(@PathVariable("id") Integer id);
@PostMapping("/updateById")
void updateById(@RequestParam Students student);
}
@Service("adminService")
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements AdminService {
@Autowired
private TokenUtil tokenUtil;
@Autowired
private StudentClient studentClient;
@Override
@GlobalTransactional
public void init() {
Map<String, String> major = new HashMap<>();
major.put("动物医学(中外合作办学)", "动医(中外)");
List<Students> students = studentClient.selectListById(1);
int b = 0;
for (Students student : students) {
if (major.get(student.getMajor()) != null) {
student.setMajorShortName(major.get(student.getMajor()));
studentClient.updateById(student);
b++;
System.out.println("剩余 " + (students.size() - b) + "条");
}
}
/*-------------------- 初始化辅导员联系方式 --------------------*/
List<Theacher> theachers = new ArrayList<>();
theachers.add(new Theacher("人工智能学院", "郭小月", "15225969758"));
int a = 0;
for (Students student : students) {
for (Theacher theacher : theachers) {
if (student.getAcademy().equals(theacher.getA())) {
student.setCounselorName(theacher.getB());
student.setCounselorNum(theacher.getC());
studentClient.updateById(student);
a++;
System.out.println("剩余 " + (students.size() - a) + "条");
}
}
}
}
}
源码已上传 https://gitee.com/su_shuwang/electronic-registration-cloud.git