title: Spring Boot实战学习笔记5
tags:Spring Boot实战
grammar_cjkRuby: true
本文为学习Spring Boot实战的学习笔记,学习了一遍,但是好记性不如烂笔头,所以文章记录下来。图书购买地址为: https://item.jd.com/11894632.html.
Spring Boot实战学习笔记1
Spring Boot实战学习笔记2
Spring Boot实战学习笔记3
Spring Boot实战学习笔记4
Spring Boot实战学习笔记5
SpringBoot常用属性配置
Spring Integration是专门针对基于Spring的项目的安全框架.
安全框架有两个重要概念:认证(Authentication)和授权(Authorization).
认证即确认用户可以访问当前系统,授权即确定用户在当前系统下所拥有的功能权限.
需要注册特殊的DelegationfilterProy过滤器到WebApplication.开启@EnableWebSecurity.
org.springframework.boot.autoconfigure.security.SecurityProperties和org.springframework.boot.autoconfigure.security.SecurityProperties
依赖的包为:spring-boot-starter-security
源码: /ch9_1
处理大数据操作的一个框架,主要用来读取数据,然后进行一定处理后输出成指定的形式.
组成部分:
名称 | 用途 |
---|---|
JobRepository | 用来注册的Job的容器 |
JobLauncher | 用来启动Job的接口 |
Job | 要实际执行的任务,包含一个或多个Step |
Step | Step包括ItemReader,ItemProcessor,ItemWriter |
ItemReader | 用来启动Job的接口 |
ItemProcessor | 用来启动Job的接口 |
ItemWriter | 用来启动Job的接口 |
源码位于org.springframework.boot.autoconfigure.batch目录下.
依赖包: spring-boot-starter-batch.
源码位于: /ch9_2
Spring Batch 之 Spring Batch 简介(一)
Spring Batch 之 Spring Batch 简介(二)
Spring Batch 之 Spring Batch 简介(三)
Spring Batch 之 Spring Batch 简介(四)
两个重要概念:消息代理(message broker)和目的地(destination).当消息发送者发送消息后,消息将有消息代理接管,消息代理保证消息传递到指定的目的地.
异步消息两种形式的目的地:队列(queue)和主题(topic).队列用于点对点式(point-to-point)的消息通信,主题用于发布/订阅式(publish/subscribe)的消息通信.
JMS(Java Message Service): Java消息服务,是基于JVM消息代理的规范,而ActiveMQ等是JMS消息代理的实现.
AMQP(Advanced Message Queuing Protocol)也是消息代理规范,兼容JMS还支持跨语言和平台,RabbitMQ是AMQP的实现.
Spring对JMS和AMQP的支持分别为spring-jms和spring-rabbit.
消息规范类型 | JMS | AMQP |
---|---|---|
spring支持 | spring-jms | spring-rabbit |
连接消息代理 | JmsTemplate | RabbitTemplate |
监听消息代理 | @JmsListener | @RabbitListener |
开启注解 | @EnableJms | @EnableRabbit |
JMS的自动配置在:org.springframework.boot.autoconfigure.jms目录下.
ActiveMQ.
/ch9_3_4 ActiveMQ相关例子.
RabbitMQ:相关例子:/ch9_3_5
EIP(Enterprise Integration Patters,企业集成模式).解决不同系统之间交互的问题,通过异步消息来驱动达到系统交互时系统之间的松耦合.
Spring Integration由:Message,Channel,Message Endpoint组成.
Message是用来不同部分之间传递的数据. 由消息体(payload)和消息头(header)组成.消息体可以是任何数据类型(XML,JSON,Jva对象).消息头表示的元数据解释消息体的内容.
消息发送者发送消息到通道(Channel),消息接受者从通道中接受消息.
消息端点(Message EndPoint)是真正处理消息的(Message)组件,它还可以控制通道的路由.
通过IntegrationFlow来定义系统集成流程,通过IntegrationFlows和IntegrationFlowBuilder来实现使用FluentAPI.
源码:/ch9_4
模板引擎默认开启缓存,如果关闭
spring.thymeleaf.cache=false
下载地址: http://repo.spring.io/release/org/springframework/springloaded/
最新版:http://repo.spring.io/release/org/springframework/springloaded/1.2.7.RELEASE/springloaded-1.2.7.RELEASE.jar
VM arguments的参数值如下:
//其中路径为jar包所在路径,注意路径不要空格
-javaagent:D:/work/jars/springloaded-1.2.7.RELEASE.jar -noverify
参考文章
收费的版本.暂时不试了.
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<version>1.5.6.RELEASEversion>
dependency>
maven 打包
mvn package
gradle 打包
build.gradle内容如下
apply plugin: 'jar'
def buildTime = new Date().format("yyyyMMddHHmm")
def buildDate = new Date().format("yyyyMMdd")
jar {
baseName = "myproject"
//classifier = buildTime
extension = "jar"
}
//执行命令
$ gradle task;
$ gradle jar;
//运行jar包
jar -jar myproject.jar
sudo ln -s /var/apps/ch10-0.0.1-SNAPSHOT.jar /etc/init.d/ch10
service ch10 start //启动服务
service ch10 stop //停止服务
service ch10 status //服务状态
chkconfig ch10 on //开机启动
/etc/systemd/system/ 新建 ch10.service
[Unit]
Description=ch10
After=syslog.target
[Service]
ExecStart=/usr/bin/java -jar /var/apps/ch10-0.0.1-SNAPSHOT.jar
[Install]
WantBy=multi-user.target
systemctl start ch10 或 systemctl start ch10.service //启动服务
systemctl stop ch10 或 systemctl stop ch10.service //停止服务
systemctl status ch10 或 systemctl status ch10.service //停止服务
systemctl enable ch10 或 systemctl enable ch10.service //开机启动
journalctl -u ch10 或journalctl -u ch10.service //项目日志
gradle 打包
build.gradle内容如下:
apply plugin: 'jar'
def buildTime = new Date().format("yyyyMMddHHmm")
def buildDate = new Date().format("yyyyMMdd")
war {
baseName = "myproject"
//classifier = buildTime
extension = "jar"
}
//执行命令
$ gradle task;
$ gradle war;
详情看book吧.
package com.wisely.ch10_4;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wisely.ch10_4.dao.PersonRepository;
import com.wisely.ch10_4.domain.Person;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Ch104Application.class) //1
@WebAppConfiguration
@Transactional //2
public class Ch104ApplicationTests {
@Autowired
PersonRepository personRepository;
MockMvc mvc;
@Autowired
WebApplicationContext webApplicationContext;
String expectedJson;
@Before //3
public void setUp() throws JsonProcessingException{
Person p1 = new Person("wyf");
Person p2 = new Person("wisely");
personRepository.save(p1);
personRepository.save(p2);
expectedJson =Obj2Json(personRepository.findAll()); //4
mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
protected String Obj2Json(Object obj) throws JsonProcessingException{//5
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(obj);
}
@Test
public void testPersonController() throws Exception {
String uri="/person";
MvcResult result = mvc.perform(MockMvcRequestBuilders.get(uri).accept(MediaType.APPLICATION_JSON))
.andReturn(); //6
int status = result.getResponse().getStatus(); //7
String content = result.getResponse().getContentAsString(); //8
Assert.assertEquals("错误,正确的返回值为200",200, status); //9
Assert.assertEquals("错误,返回值和预期返回值不一致", expectedJson,content); //10
}
}
Spring Boot有四大神器,分别是auto-configuration、starters、cli、actuator
http://blog.csdn.net/linxingliang/article/details/52263740
http://blog.csdn.net/dong_19890208/article/details/52836436
HTTP方法 | 路径 | 描述 | 鉴权 |
---|---|---|---|
GET | /actuator | 所有Endpoint的列表,需要加入spring HATEOAS的支持 | |
GET | /autoconfig | 查看自动配置的使用情况 | true |
GET | /configprops | 查看配置属性,包括默认配置 | true |
GET | /beans | 查看bean及其关系列表 | true |
GET | /dump | 打印线程栈 | true |
GET | /env | 查看所有环境变量 | true |
GET | /env/{name} | 查看具体变量值 | true |
GET | /health | 查看应用健康指标 | false |
GET | /info | 查看应用信息 | false |
GET | /mappings | 查看所有url映射 | true |
GET | /metrics | 查看应用基本指标[metrics(度量)] | true |
GET | /metrics/{name} | 查看具体指标 | true |
POST | /shutdown | 关闭应用 | true |
GET | /trace | 查看基本追踪信息 | true |
参考文章
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
<version>1.5.6.RELEASEversion>
dependency>
http://localhost:8080/actuator
//shudown默认是关闭的,打开开关配置如下:
//shutdown 不支持get方式,需要用post方式
endpoints.shutdown.enabled=true //开启某个端点
endpoints.enabled=false //关闭所有的端点
自定义访问端点名称:
配置后可以通过http://localhost:8888/mybeans来访问beans
endpoints.beans.id=mybeans //修改访问名称
配置后访问地址为http://localhost:8888/manager/actuator
management.context-path=/manager //修改总访问地址
management.port=8888 //修改访问端口
management.port=-1 //关闭http访问
源码: /ch11_1
DemoApplication.java
StatusService.java
StatusEndPoint.java
//查看系统健康情况
http://localhost:8080/health
源码: /ch11_1
StatusHealth.java//实现了HealthIndicator并重写了Health()方法
spring中内置的HealthIndicator(健康指标)
名称 | 描述 |
---|---|
DiskSpaceHealthIndicator | 检查低磁盘空间 |
DataSourceHealthIndicator | 检查DataSource连接是否能获得 |
ElasticsearchHealthIndicator | 检查ElasticSearch集群是否运行 |
JmsHealthIndicator | 检查JMS消息代理服务器是否在运行 |
MailHealthIndicator | 检查邮件服务器是否在运行 |
MongoHealthIndicator | 检查MongoDB是否在运行 |
RabbitHealthIndicator | 检查RabbitMQ是否在运行 |
RedisHealthIndicator | 检查Redis是否正常运行 |
SolrHealthIndicator | 检查Solr是否正常运行 |
java内置的jconsole,通过cmd来执行只有,然后选择java进程,随后查看
项目中依赖Romote Shell(spring-boot-starter-remote-shell),启动之后控制台会有连接密码.通过ssh连接工具连接(用户名为user).
help
metrics
endpoint list
endpoint invoke health
//自定义ssh连接的用户及密码,在application.properties中
shell.auth.simple.user.name=username
shell.auth.simple.user.password=123456
Config Server
Netflix OSS的Eureka
@EnableEurekaServer //服务端
@EnableEurekaClient //客户端
Zuul
@EnableZuulProxy
Ribbon和Feign
@FeignClient
@EnableCircuitBreaker
源码/ch12
Spring Cloud和Docker会另外学习.此处略过.