Project technology selection
- Spring Boot
- Spring MVC
- MyBatis + Universal Mapper ( Official website information https://mapperhelper.github.io/docs/)
- Spring Cloud Alibaba
Project structure
pom file
<?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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.laiya</groupId>
<artifactId>user-center</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-center</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--Sporing Boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
<!-- nacos Dynamic configuration -->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
<!--Redis-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-data-redis-reactive</artifactId>-->
<!-- </dependency>-->
<!--Mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!--Test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Integrate Spring Cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Integrate Spring Cloud Alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- Set up development separately , test , Production environment -->
<profiles>
<!-- development environment -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment>dev</environment>
</properties>
</profile>
<!-- Test environment -->
<profile>
<id>test</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<environment>test</environment>
</properties>
</profile>
<!-- Production environment -->
<profile>
<id>pro</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<environment>pro</environment>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<!-- Package file name : Project name - Environmental Science - edition -->
<finalName>${project.artifactId}-${environment}-${project.version}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- Turn on the filter replacement function -->
<filtering>true</filtering>
<includes>
<!-- Only the current environment files are included in the package -->
<include>application.yml</include>
<include>application-${environment}.yml</include>
<include>bootstrap.yml</include>
<include>mybatis/*/*.xml</include>
<include>templates/*.html</include>
<include>static/</include>
</includes>
</resource>
</resources>
</build>
</project>
pom It is equipped with multi environment packaging ,openfeign,zipkin,actuator,sentinel,websocket,lombok Wait for the components below
- openfeign It is used to provide a solution for the call between services in microservice architecture , It can be understood as a encapsulated request pattern .
- zipkin It's a tool for link tracking , Is an open source distributed tracking system , Every service to zipkin Report timing data ,zipkin According to the calling relationship Zipkin UI Generate dependency graph ( In the future blog will be )
- actuator It's a health check for applications ,Spring Boot Actuator Can help you monitor and manage Spring Boot application , For example, physical examination 、 Audit 、 Statistics and HTTP Tracking, etc . All of these features can be achieved by JMX perhaps HTTP endpoints To obtain a .
- sentinel It is a highly available traffic protection component for distributed service architecture , The main pointcut is traffic , From current limiting 、 Traffic shaping 、 Fusing the drop 、 System load protection 、 Hot spot protection and other dimensions help developers ensure the stability of microservices .
- websocket Full duplex protocol , It can be simply understood that the server can actively send requests to the client
To implement multi environment packaging, you need to configure multiple *.yml The configuration file , The configuration file
- application.yml Content
spring:
profiles:
active: "@[email protected]"
application-dev Content
#======================================#
#========== Server settings ==========#
#======================================#
server:
port: 8086
# servlet:
# context-path: /user-center
tomcat:
uri-encoding: UTF-8
spring:
#server name
application:
name: user-center
#======================================#
#========== Database settings ==========#
#======================================#
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username:
password: xxxxx
url: jxxxxx
#======================================#
#========== Nacos ==========#
#======================================#
cloud:
nacos:
discovery:
# nacos server address
server-addr: xxxx
thymeleaf:
prefix: classpath:/templates/
check-template-location: true
suffix: .html
encoding: utf-8
servlet:
content-type: text/html
mode: HTML5
cache: false
#======================================#
#========== zipkin ==========#
#======================================#
zipkin:
base-url:xxx
discovery-client-enabled: false
sleuth:
sampler:
# Sampling rate 10%
probability: 1.0
#======================================#
#========== MyBatis settings ==========#
#======================================#
mybatis:
mapper-locations: classpath:templates/*/*.xml
#======================================#
#========== Redis settings ==========#
#======================================#
# redis:
# enabled: true
# host: xxx
# port: 6379
# ssl: false
# database: 0
# password: x'x'x'x
# jedis:
# pool:
# # Maximum number of free connections
# maxIdle: 3
# # Maximum number of active connections
# maxActive: 20
feign:
client:
config:
# Microservices you want to configure name Global configuration default
user-center:
loggerLevel: full
# httpclient Connection pool
httpclient:
enabled: true
# feign Is the maximum number of connections
max-connections: 200
# feign The maximum number of connections per path
max-connections-per-route: 50
#======================================#
#========== Config sttings ==========#
#======================================#
#
body:
controllerMethodList:
swaggerResources,
getDocumentation
management:
endpoints:
web:
exposure:
include: '*'
mysql Configuration information description
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username:
password: xxxxx
url: jxxxxx
mysql edition >= 6.x Need to use com.mysql.cj.jdbc.Driver
mysql edition <= 5.x Need to use com.mysql.jdbc.Driver
** com.mysql.jdbc.Driver Source code as follows **
public class Driver extends com.mysql.cj.jdbc.Driver {
public Driver() throws SQLException {
super();
}
static {
System.err.println("Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. "
+ "The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.");
}
}
We can see through the source code Driver Inherited com.mysql.cj.jdbc.Driver, If not cj
The project will run, but it will print a warning , The driver version needs to be upgraded
So don't lie when this sentence appears .
For microservices , We try to follow three steps when adding microservice components
1 pom File import dependency
2 yml Write configuration
3 Item annotated
The introduction of user microservices Nacos step
- Introduce dependencies
<!--Nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- yml Write configuration
#=========================#
#========== Nacos =========#
#=========================#
spring:
cloud:
nacos:
discovery:
server-addr: (nacos Request address , The format is ip[ domain name ]:port; for example xxx.com:8848, Be careful Don't add it before the address http the latter https)
- Item annotated ( There is no comment , Unwanted )
** After starting the current project , After success, you will find out first Nacos There will be a user-center Service for **
thus Microservices are registered with Nacos Then it succeeded , We found service registration easy , It's just two simple steps , Plus dependence , Write configuration
Packaging for different environments The order is mvn install -Ppro/-Pdev/-Ptest, You can pack whatever environment you need
The next section will show you about services and service invocations , Hope to help you build a simple micro service system .