基于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

猜你喜欢

转载自blog.csdn.net/su2231595742/article/details/123340769