Практический туториал SpringBoot, подытоженный печенью за неделю, такой практичный!

Spring Boot Java
Практический туториал SpringBoot, подытоженный печенью за неделю, такой практичный!

Адрес фактического центра электронной коммерции SpringBoot (40k+star):GitHub.com/macro-positive/…

Резюме

Я использую SpringBoot каждый день, но некоторые практические моменты знания SpringBoot не очень понятны! Недавно я сделал краткий обзор практических знаний по SpringBoot, думаю, он будет очень полезен для друзей, которые переходят со Spring на SpringBoot!

предисловие

Прежде всего, давайте разберемся, зачем существует SpringBoot?

Являясь облегченной альтернативой J2EE, Spring позволяет нам реализовывать функции EJB, используя простые объекты Java (POJO) посредством внедрения зависимостей и аспектно-ориентированного программирования без разработки тяжеловесных Enterprise JavaBeans (EJB).

В то время как код компонента Spring является легковесным, его конфигурация тяжеловесна. Несмотря на то, что Spring позже представил сканирование компонентов на основе аннотаций и настройку на основе Java, чтобы сделать его намного проще, Spring по-прежнему требует большой настройки. Кроме того, управление зависимостями проекта также является громоздким, и мы не можем гарантировать совместимость зависимостей каждой версии.

Чтобы упростить настройку в Spring и унифицировать версии различных зависимостей, родился SpringBoot!

Введение

SpringBoot — это, по сути, Spring, и он помогает нам упростить разработку приложений Spring благодаря некоторым собственным функциям. Есть три основных особенности:

  • Автоматическая конфигурация: для многих общих прикладных функций приложений Spring SpringBoot может автоматически предоставлять соответствующие конфигурации, а разработчикам интегрированных функций требуется лишь очень небольшая настройка.
  • Зависимости при запуске: сообщите SpringBoot, какая функция ему нужна, и он может ввести соответствующую библиотеку, не учитывая версию библиотеки, от которой зависит функция.
  • Актуатор: вы можете получить более глубокое представление о внутренней ситуации приложения SpringBoot, например, о том, какие bean-компоненты создаются, об автоматических решениях по настройке, информации о состоянии приложения и т. д.

начать использовать

Создать приложение

Существует множество способов создания приложений SpringBoot, здесь для создания приложений используется самый популярный инструмент разработки IDEA.

  • сначала черезFile->New Projectсоздать проект;

  • затем выберите черезSpring Initializrсоздать приложение SpringBoot;

  • Заполнить проект MavengroupIdиartifactIdи выберите версию Java;

  • Выберите начальную зависимость, вот начальная зависимость для включения веб-функции;

  • После выбора места хранения проекта вы можете успешно создать приложение SpringBoot.

Просмотр приложений

Структура проекта

Базовая структура только что созданного приложения SpringBoot выглядит следующим образом.

mall-tiny-boot
├─pom.xml # Maven构建文件
└─src
   ├─main
   │  ├─java
   │  │  └─MallTinyApplication.java # 应用程序启动类
   │  └─resources
   │     └─application.yml # SpringBoot配置文件
   └─test
       └─java
           └─MallTinyApplicationTests.java # 基本的集成测试类

Класс запуска приложения

MallTinyApplicationОн играет роль конфигурации и руководства в приложении SpringBoot через@SpringBootApplicationАннотация позволяет сканировать компоненты и выполнять автоматическую настройку черезSpringApplication.run()запуск бутстрап-приложения;

//开启组件扫描和应用装配
@SpringBootApplication
public class MallTinyApplication {

    public static void main(String[] args) {
        //负责引导应用程序启动
        SpringApplication.run(MallTinyApplication.class, args);
    }

}

@SpringBootApplicationАннотация представляет собой комбинацию трех аннотаций и имеет следующие три функции аннотаций:

  • @Configuration: используется для объявления конфигурации Java в Spring;
  • @ComponentScan: включить сканирование компонентов.Когда мы объявляем компонент, он будет автоматически обнаружен и зарегистрирован как компонент в контексте приложения Spring;
  • @EnableAutoConfiguration: Включите автоконфигурацию SpringBoot, чтобы упростить запись конфигурации.

тестовое приложение

можно использовать@RunWithи@SpringBootTestдля создания контекста приложения Spring через@Testаннотация для объявления тестового метода.

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class MallTinyApplicationTests {
    @Autowired
    private PmsBrandService pmsBrandService;

    @Test
    public void contextLoads() {
    }

    @Test
    public void testMethod() {
        List<PmsBrand> brandList = pmsBrandService.listAllBrand();
        log.info("testMethod:{}", brandList);
    }

}

Написать конфигурацию приложения

Когда нам нужно точно настроить автоматически настроенные параметры, мы можемapplication.ymlНастройка в файле, например, точная настройка номера порта.

server:
  port: 8088

Процесс сборки проекта

Проекты SpringBoot можно собирать с помощью Maven, сначала нам нужно наследоватьspring-boot-starter-parentЭта родительская зависимость может управлять версией всех официальных начальных зависимостей SpringBoot.Далее, когда мы используем официальные начальные зависимости, нам не нужно указывать номер версии. Нам также нужно использовать плагин SpringBoot, который в основном используется для упаковки приложения в виде исполняемого файла Jar.

<?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.macro.mall</groupId>
    <artifactId>mall-tiny-boot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>mall-tiny-boot</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <skipTests>true</skipTests>
    </properties>
    
    <!--继承SpringBoot父项目,控制所有依赖版本-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <!--SpringBoot起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!--SpringBoot插件,可以把应用打包为可执行Jar-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Используйте стартовые зависимости

Преимущества использования стартовых зависимостей

Прежде чем использовать начальные зависимости, давайте сначала разберемся в преимуществах использования начальных зависимостей.Когда мы используем SpringBoot и нам нужно интегрировать веб-функции, нам нужно толькоpom.xmlПросто добавьте стартовую зависимость в .

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Если это проект Spring, нам нужно добавить много зависимостей, и нам также нужно учитывать совместимость каждой версии зависимостей, что довольно хлопотно.

Укажите зависимости на основе функций

Когда нам нужно разработать веб-приложение, нам нужно использовать базу данных MySQL для хранения, использовать Swagger для создания документов API и добавить следующие начальные зависимости. Следует отметить, что только официальные стартовые зависимости не нуждаются в указании номера версии, а другие все равно нужно указывать сами по себе.

<dependencies>
    <!--SpringBoot Web功能起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--MyBatis分页插件-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.10</version>
    </dependency>
    <!--集成druid连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    <!--Mysql数据库驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.15</version>
    </dependency>
    <!--springfox swagger官方Starter-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-boot-starter</artifactId>
        <version>3.0.0</version>
    </dependency>
</dependencies>

Переопределить библиотеки в стартовых зависимостях

По сути, стартовые зависимости ничем не отличаются от тех, которые вы обычно используете, вы можете использовать Maven для исключения нежелательных зависимостей. Например, если вы не хотите использовать контейнер tomcat, но хотите использовать контейнер undertow, вы можете исключить tomcat из зависимостей веб-функций.

<dependencies>
    <!--SpringBoot Web功能起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <!--排除tomcat依赖-->
            <exclusion>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <groupId>org.springframework.boot</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <!--undertow容器-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-undertow</artifactId>
    </dependency>
</dependencies>

Использовать автоматическую настройку

Автоматическая настройка SpringBoot — это процесс выполнения (точнее, при запуске приложения), учитывающий множество факторов, прежде чем решить, какую конфигурацию Spring следует использовать, а какую нет.

Например, когда мы используем Spring для интеграции MyBatis, нам необходимо выполнить следующие шаги:

  • В соответствии с конфигурацией подключения к базе данных настройте объект dataSource;
  • Настройте объект sqlSessionFactory в соответствии с объектом dataSource и файлом SqlMapConfig.xml (который содержит путь к файлу mapper.xml и конфигурацию пути интерфейса сопоставления).

Когда мы используем SpringBoot для интеграции MyBatis, объекты dataSource и sqlSessionFactory создаются автоматически, если мыapplication.ymlИ добавьте некоторую пользовательскую конфигурацию в конфигурацию Java.

существуетapplication.ymlНастройте информацию о подключении к базе данных и путь к файлу mapper.xml в формате .

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root

mybatis:
  mapper-locations:
    - classpath:mapper/*.xml
    - classpath*:com/**/mapper/*.xml

Используя конфигурацию Java, настройте путь к интерфейсу преобразователя.

/**
 * MyBatis配置类
 * Created by macro on 2019/4/8.
 */
@Configuration
@MapperScan("com.macro.mall.tiny.mbg.mapper")
public class MyBatisConfig {
}

После использования автоматической настройки конфигурация интеграции других функций значительно сокращается, и мы можем больше сосредоточиться на разработке программных функций.

пользовательская конфигурация

Автоматическая настройка пользовательского переопределения бина

Хотя автоконфигурация работает хорошо, иногда автоматически сконфигурированные компоненты не соответствуют вашим потребностям Мы можем определить те же самые компоненты, чтобы переопределить автоматически сконфигурированные компоненты.

Например, когда мы используем Spring Security для защиты безопасности приложений, поскольку автоматическая настройка не может удовлетворить наши потребности, нам необходимо настроить конфигурацию на основе WebSecurityConfigurerAdapter. Здесь мы настроили множество конфигураций, таких как изменение аутентификации на основе сеанса для использования токенов JWT, настройка некоторых путей для несанкционированного доступа, настройка пути интерфейса входа в систему, отключение функции csrf и т. д.

/**
 * SpringSecurity的配置
 * Created by macro on 2018/4/26.
 */
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UmsAdminService adminService;
    @Autowired
    private RestfulAccessDeniedHandler restfulAccessDeniedHandler;
    @Autowired
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;
    @Autowired
    private IgnoreUrlsConfig ignoreUrlsConfig;

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        List<String> urls = ignoreUrlsConfig.getUrls();
        String[] urlArray = ArrayUtil.toArray(urls, String.class);
        httpSecurity.csrf()// 由于使用的是JWT,我们这里不需要csrf
                .disable()
                .sessionManagement()// 基于token,所以不需要session
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.GET,urlArray) // 允许对于网站静态资源的无授权访问
                .permitAll()
                .antMatchers("/admin/login")// 对登录注册要允许匿名访问
                .permitAll()
                .antMatchers(HttpMethod.OPTIONS)//跨域请求会先进行一次options请求
                .permitAll()
                .anyRequest()// 除上面外的所有请求全部需要鉴权认证
                .authenticated();
        // 禁用缓存
        httpSecurity.headers().cacheControl();
        // 添加JWT filter
        httpSecurity.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);
        //添加自定义未授权和未登录结果返回
        httpSecurity.exceptionHandling()
                .accessDeniedHandler(restfulAccessDeniedHandler)
                .authenticationEntryPoint(restAuthenticationEntryPoint);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService())
                .passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        //获取登录用户信息
        return username -> {
            AdminUserDetails admin = adminService.getAdminByUsername(username);
            if (admin != null) {
                return admin;
            }
            throw new UsernameNotFoundException("用户名或密码错误");
        };
    }

    @Bean
    public JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter() {
        return new JwtAuthenticationTokenFilter();
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

}

Автоматическая тонкая настройка конфигурации

Иногда нам нужно только настроить автоматическую конфигурацию в соответствии с требованиями, и нам не нужно переопределять автоматически настроенные bean-компоненты.application.ymlнастраивается в файле свойств.

Например, тонкая настройка порта, на котором работает приложение.

server:
  port: 8088

Например, измените информацию о соединении с базой данных.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root

Чтение пользовательских свойств файлов конфигурации

Иногда мы настраиваем некоторые свойства в файле свойств, а затем используем их в программе. На этом этапе эти пользовательские свойства можно сопоставить с классом свойств для использования.

Например, если мы хотим настроить белый список для Spring Security, нет необходимости разрешать доступ к этим путям.application.ymlДобавьте следующую конфигурацию.

secure:
  ignored:
    urls:
      - /
      - /swagger-ui/
      - /*.html
      - /favicon.ico
      - /**/*.html
      - /**/*.css
      - /**/*.js
      - /swagger-resources/**
      - /v2/api-docs/**

После этого создайте класс свойств, используйте@ConfigurationPropertiesАннотация настраивает префикс этих свойств, а затем определяетurlsСвойства соответствуют файлу свойств.

/**
 * 用于配置白名单资源路径
 * Created by macro on 2018/11/5.
 */
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "secure.ignored")
public class IgnoreUrlsConfig {

    private List<String> urls = new ArrayList<>();

}

Actuator

Ключевой особенностью SpringBoot Actuator является предоставление многочисленных веб-конечных точек в приложении, через которые они понимают внутреннее состояние среды выполнения приложения.

Обзор конечной точки

Actuator предоставляет около 20 конечных точек.Обычные пути и описания конечных точек следующие:

дорожка метод запроса описывать
/beans GET Описать все bean-компоненты в контексте приложения и отношения между ними.
/conditions GET Описывает отчет автоконфигурации, записывая, какие автоконфигурации сработали, а какие нет.
/env GET Получить все свойства среды
/env/{name} GET Получить конкретное свойство среды по имени
/mappings GET Описать отношение сопоставления между всеми путями URI и контроллерами или фильтрами.
/configprops GET Описывает, как свойства конфигурации (включая значения по умолчанию) внедряются в bean-компоненты.
/metrics GET Получите метрики приложений, такие как JVM и информацию о процессах
/metrics/{name} GET Получить метрику приложения с указанным именем
loggers GET Просмотр уровня журнала в приложении
/threaddump GET Получите снимок активности потока
/health GET Сообщает индикаторы работоспособности приложения, эти значения предоставляются классом реализации HealthIndicator
/shutdown POST закрыть приложение
/info GET Получите пользовательскую информацию для приложения, которая предоставляется атрибутами, начинающимися с информации

Просмотр сведений о конфигурации

  • Прямой доступ к корневой конечной точке, вы можете получить все пути доступа к конечной точке, адрес доступа к корневой конечной точке:http://localhost:8088/actuator
{
    "_links": {
        "self": {
            "href": "http://localhost:8088/actuator",
            "templated": false
        },
        "beans": {
            "href": "http://localhost:8088/actuator/beans",
            "templated": false
        },
        "caches-cache": {
            "href": "http://localhost:8088/actuator/caches/{cache}",
            "templated": true
        },
        "caches": {
            "href": "http://localhost:8088/actuator/caches",
            "templated": false
        },
        "health": {
            "href": "http://localhost:8088/actuator/health",
            "templated": false
        },
        "health-path": {
            "href": "http://localhost:8088/actuator/health/{*path}",
            "templated": true
        },
        "info": {
            "href": "http://localhost:8088/actuator/info",
            "templated": false
        },
        "conditions": {
            "href": "http://localhost:8088/actuator/conditions",
            "templated": false
        },
        "configprops": {
            "href": "http://localhost:8088/actuator/configprops",
            "templated": false
        },
        "env": {
            "href": "http://localhost:8088/actuator/env",
            "templated": false
        },
        "env-toMatch": {
            "href": "http://localhost:8088/actuator/env/{toMatch}",
            "templated": true
        },
        "loggers": {
            "href": "http://localhost:8088/actuator/loggers",
            "templated": false
        },
        "loggers-name": {
            "href": "http://localhost:8088/actuator/loggers/{name}",
            "templated": true
        },
        "heapdump": {
            "href": "http://localhost:8088/actuator/heapdump",
            "templated": false
        },
        "threaddump": {
            "href": "http://localhost:8088/actuator/threaddump",
            "templated": false
        },
        "metrics-requiredMetricName": {
            "href": "http://localhost:8088/actuator/metrics/{requiredMetricName}",
            "templated": true
        },
        "metrics": {
            "href": "http://localhost:8088/actuator/metrics",
            "templated": false
        },
        "scheduledtasks": {
            "href": "http://localhost:8088/actuator/scheduledtasks",
            "templated": false
        },
        "mappings": {
            "href": "http://localhost:8088/actuator/mappings",
            "templated": false
        }
    }
}
  • пройти через/beansEndpoint, вы можете получить информацию о bean-компоненте в контексте приложения Spring, такую ​​как тип и свойства зависимостей bean-компонента и т. д., адрес доступа:http://localhost:8088/actuator/beans
{
	"contexts": {
		"application": {
			"beans": {
				"sqlSessionFactory": {
					"aliases": [],
					"scope": "singleton",
					"type": "org.apache.ibatis.session.defaults.DefaultSqlSessionFactory",
					"resource": "class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]",
					"dependencies": [
						"dataSource"
					]
				},
				"jdbcTemplate": {
					"aliases": [],
					"scope": "singleton",
					"type": "org.springframework.jdbc.core.JdbcTemplate",
					"resource": "class path resource [org/springframework/boot/autoconfigure/jdbc/JdbcTemplateConfiguration.class]",
					"dependencies": [
						"dataSource",
						"spring.jdbc-org.springframework.boot.autoconfigure.jdbc.JdbcProperties"
					]
				}
			}
		}
	}
}
  • пройти через/conditionsEndpoint, вы можете получить отчет об автоматической настройке текущего приложения,positiveMatchesУказывает на действующую автоматическую настройку,negativeMatchesУказывает, что автоматическая конфигурация не действует.
{
	"contexts": {
		"application": {
			"positiveMatches": {
				"DruidDataSourceAutoConfigure": [{
					"condition": "OnClassCondition",
					"message": "@ConditionalOnClass found required class 'com.alibaba.druid.pool.DruidDataSource'"
				}]
			},
			"negativeMatches": {
				"RabbitAutoConfiguration": {
					"notMatched": [{
						"condition": "OnClassCondition",
						"message": "@ConditionalOnClass did not find required class 'com.rabbitmq.client.Channel'"
					}],
					"matched": []
				}
			}
		}
	}
}
  • пройти через/envКонечная точка для получения всех свойств конфигурации, включая переменные среды, свойства JVM, аргументы командной строки иapplication.ymlсвойства в .
{
	"activeProfiles": [],
	"propertySources": [{
			"name": "systemProperties",
			"properties": {
				"java.runtime.name": {
					"value": "Java(TM) SE Runtime Environment"
				},
				"java.vm.name": {
					"value": "Java HotSpot(TM) 64-Bit Server VM"
				},
				"java.runtime.version": {
					"value": "1.8.0_91-b14"
				}
			}
		},
		{
			"name": "applicationConfig: [classpath:/application.yml]",
			"properties": {
				"server.port": {
					"value": 8088,
					"origin": "class path resource [application.yml]:2:9"
				},
				"spring.datasource.url": {
					"value": "jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai",
					"origin": "class path resource [application.yml]:6:10"
				},
				"spring.datasource.username": {
					"value": "root",
					"origin": "class path resource [application.yml]:7:15"
				},
				"spring.datasource.password": {
					"value": "******",
					"origin": "class path resource [application.yml]:8:15"
				}
			}
		}
	]
}
  • пройти через/mappingsКонечная точка, вы можете просмотреть отношения сопоставления между всеми путями URI и контроллерами или фильтрами, здесь вы можете увидеть наше собственное определениеPmsBrandControllerиJwtAuthenticationTokenFilterкартографические отношения.
{
	"contexts": {
		"application": {
			"mappings": {
				"dispatcherServlets": {
					"dispatcherServlet": [{
						"handler": "com.macro.mall.tiny.controller.PmsBrandController#createBrand(PmsBrand)",
						"predicate": "{POST /brand/create}",
						"details": {
							"handlerMethod": {
								"className": "com.macro.mall.tiny.controller.PmsBrandController",
								"name": "createBrand",
								"descriptor": "(Lcom/macro/mall/tiny/mbg/model/PmsBrand;)Lcom/macro/mall/tiny/common/api/CommonResult;"
							},
							"requestMappingConditions": {
								"consumes": [],
								"headers": [],
								"methods": [
									"POST"
								],
								"params": [],
								"patterns": [
									"/brand/create"
								],
								"produces": []
							}
						}
					}]
				}
			},
			"servletFilters": [{
				"servletNameMappings": [],
				"urlPatternMappings": [
					"/*",
					"/*",
					"/*",
					"/*",
					"/*"
				],
				"name": "jwtAuthenticationTokenFilter",
				"className": "com.macro.mall.tiny.component.JwtAuthenticationTokenFilter"
			}]
		}
	}
}

Просмотр показателей времени выполнения

  • пройти через/metricsEndpoint, вы можете получить метрики приложения, но получить только название метрики;
{
    "names": [
        "http.server.requests",
        "jvm.buffer.count",
        "jvm.buffer.memory.used",
        "jvm.buffer.total.capacity",
        "jvm.classes.loaded",
        "jvm.classes.unloaded",
        "jvm.gc.live.data.size",
        "jvm.gc.max.data.size",
        "jvm.gc.memory.allocated",
        "jvm.gc.memory.promoted",
        "jvm.gc.pause",
        "jvm.memory.committed",
        "jvm.memory.max",
        "jvm.memory.used",
        "jvm.threads.daemon",
        "jvm.threads.live",
        "jvm.threads.peak",
        "jvm.threads.states",
        "logback.events",
        "process.cpu.usage",
        "process.start.time",
        "process.uptime",
        "system.cpu.count",
        "system.cpu.usage"
    ]
}
  • Вам нужно добавить имя индикатора, чтобы получить соответствующее значение, такое как получение информации о памяти, используемой текущей JVM, и адрес доступа:http://localhost:8088/actuator/metrics/jvm.memory.used
{
    "name": "jvm.memory.used",
    "description": "The amount of used memory",
    "baseUnit": "bytes",
    "measurements": [
        {
            "statistic": "VALUE",
            "value": 3.45983088E8
        }
    ],
    "availableTags": [
        {
            "tag": "area",
            "values": [
                "heap",
                "nonheap"
            ]
        },
        {
            "tag": "id",
            "values": [
                "Compressed Class Space",
                "PS Survivor Space",
                "PS Old Gen",
                "Metaspace",
                "PS Eden Space",
                "Code Cache"
            ]
        }
    ]
}
  • пройти черезloggersEndpoint, вы можете просмотреть информацию об уровне журнала в приложении, вы можете видеть, что мы поставилиROOTЖурнал области установлен на INFO, в то время какcom.macro.mall.tinyПараметр для всего пакета — DEBUG.
{
	"levels": [
		"OFF",
		"ERROR",
		"WARN",
		"INFO",
		"DEBUG",
		"TRACE"
	],
	"loggers": {
		"ROOT": {
			"configuredLevel": "INFO",
			"effectiveLevel": "INFO"
		},
		"com.macro.mall.tiny": {
			"configuredLevel": "DEBUG",
			"effectiveLevel": "DEBUG"
		}
	}
}
  • пройти через/healthКонечная точка для просмотра показателей работоспособности приложения.
{
    "status": "UP"
}

закрыть приложение

через POST-запрос/shutdownКонечная точка может напрямую закрыть приложение, но это должно бытьendpoints.shutdown.enabledсвойство имеет значение true для использования.

{
    "message": "Shutting down, bye..."
}

Пользовательский привод

Иногда нам нужно настроить конечные точки Actuator в соответствии с нашими потребностями.

  • Например, некоторые конечные точки Actuator закрыты по умолчанию, если мы хотим открыть все конечные точки, мы можем установить это так;
management:
  endpoints:
    web:
      exposure:
        include: '*'
  • Например, мы хотим настроить базовый путь конечной точки Actuator, например изменить на/monitor, поэтому наш адрес доступа становится таким:http://localhost:8088/monitor
management:
  endpoints:
    web:
      base-path: /monitor

Общие стартовые зависимости

Начальные зависимости не только упрощают настройку зависимостей для создания приложений, но и организуют их вместе в соответствии с функциями, предоставляемыми приложению.Вот некоторые часто используемые начальные зависимости.

официальная зависимость

<dependencies>
    <!--SpringBoot整合Web功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--SpringBoot整合Actuator功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--SpringBoot整合AOP功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <!--SpringBoot整合测试功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--SpringBoot整合注解处理功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <!--SpringBoot整合Spring Security安全功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!--SpringBoot整合Redis数据存储功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!--SpringBoot整合Elasticsearch数据存储功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
    <!--SpringBoot整合MongoDB数据存储功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <!--SpringBoot整合AMQP消息队列功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <!--SpringBoot整合Quartz定时任务功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
    <!--SpringBoot整合JPA数据存储功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!--SpringBoot整合邮件发送功能依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
</dependencies>

сторонние зависимости

<dependencies>
    <!--SpringBoot整合MyBatis数据存储功能依赖-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis-version.version}</version>
    </dependency>
    <!--SpringBoot整合PageHelper分页功能依赖-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>${pagehelper-starter.version}</version>
    </dependency>
    <!--SpringBoot整合Druid数据库连接池功能依赖-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>${druid.version}</version>
    </dependency>  
    <!--SpringBoot整合Springfox的Swagger API文档功能依赖-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-boot-starter</artifactId>
        <version>${springfox-version}</version>
    </dependency>
    <!--SpringBoot整合MyBatis-Plus数据存储功能依赖-->  
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>${mybatis-plus-version}</version>
    </dependency>
    <!--SpringBoot整合Knife4j API文档功能依赖--> 
    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-spring-boot-starter</artifactId>
        <version>${knife4j-version}</version>
    </dependency>        
</dependencies>

Адрес исходного кода проекта

GitHub.com/macro-positive/…

Эта статьяGitHubGitHub.com/macro-positive/…Он был записан, приветствую всех на Star!