Spring Boot实战学习笔记5


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常用属性配置

1.Spring 基础

2.Spring 常用配置

3.Spring 高级话题

4.Spring mvc基础

6.Spring Boot核心

7.Spring Boot的Web开发

8.Spring Boot的数据访问

9.Spring Boot的企业级开发

9.1 安全控制Spring Security

9.1.1 Spring Security快速入门

Spring Integration是专门针对基于Spring的项目的安全框架.
安全框架有两个重要概念:认证(Authentication)授权(Authorization).
认证即确认用户可以访问当前系统,授权即确定用户在当前系统下所拥有的功能权限.
需要注册特殊的DelegationfilterProy过滤器到WebApplication.开启@EnableWebSecurity.

9.1.2 Spring Boot的支持

org.springframework.boot.autoconfigure.security.SecurityProperties和org.springframework.boot.autoconfigure.security.SecurityProperties

9.1.3 实战

依赖的包为:spring-boot-starter-security
源码: /ch9_1

9.2 批处理Spring Batch

9.2.1 Spring Batch快速入门

处理大数据操作的一个框架,主要用来读取数据,然后进行一定处理后输出成指定的形式.
组成部分:

名称用途
JobRepository用来注册的Job的容器
JobLauncher用来启动Job的接口
Job要实际执行的任务,包含一个或多个Step
StepStep包括ItemReader,ItemProcessor,ItemWriter
ItemReader用来启动Job的接口
ItemProcessor用来启动Job的接口
ItemWriter用来启动Job的接口

9.2.2 Spring Boot的支持

源码位于org.springframework.boot.autoconfigure.batch目录下.

9.2.3 实战

依赖包: spring-boot-starter-batch.
源码位于: /ch9_2
Spring Batch 之 Spring Batch 简介(一)
Spring Batch 之 Spring Batch 简介(二)
Spring Batch 之 Spring Batch 简介(三)
Spring Batch 之 Spring Batch 简介(四)

9.3 异步消息

两个重要概念:消息代理(message broker)和目的地(destination).当消息发送者发送消息后,消息将有消息代理接管,消息代理保证消息传递到指定的目的地.
异步消息两种形式的目的地:队列(queue)和主题(topic).队列用于点对点式(point-to-point)的消息通信,主题用于发布/订阅式(publish/subscribe)的消息通信.

9.3.1 企业级消息代理

JMS(Java Message Service): Java消息服务,是基于JVM消息代理的规范,而ActiveMQ等是JMS消息代理的实现.
AMQP(Advanced Message Queuing Protocol)也是消息代理规范,兼容JMS还支持跨语言和平台,RabbitMQ是AMQP的实现.

9.3.2 spring的支持

Spring对JMS和AMQP的支持分别为spring-jms和spring-rabbit.

消息规范类型JMSAMQP
spring支持spring-jmsspring-rabbit
连接消息代理JmsTemplateRabbitTemplate
监听消息代理@JmsListener@RabbitListener
开启注解@EnableJms@EnableRabbit

9.3.3 Spring boot的支持

JMS的自动配置在:org.springframework.boot.autoconfigure.jms目录下.
ActiveMQ.

9.3.4 JMS实战

/ch9_3_4 ActiveMQ相关例子.

9.3.5 AMQP实战

RabbitMQ:相关例子:/ch9_3_5

9.4 系统集成Spring Integration

9.4.1 Spring Integration快速入门

EIP(Enterprise Integration Patters,企业集成模式).解决不同系统之间交互的问题,通过异步消息来驱动达到系统交互时系统之间的松耦合.
Spring Integration由:Message,Channel,Message Endpoint组成.

9.4.2 Message

Message是用来不同部分之间传递的数据. 由消息体(payload)和消息头(header)组成.消息体可以是任何数据类型(XML,JSON,Jva对象).消息头表示的元数据解释消息体的内容.

9.4.3 Channel

消息发送者发送消息到通道(Channel),消息接受者从通道中接受消息.

  • 顶级接口
    • MessageChannel 顶级接口
    • PollableChannel 可轮询
    • SubscribableChannel (可订阅)
  • 常用消息通道
    • PublishSubscribeChannel 允许广播消息给所有订阅者.
    • QueueChannel 允许消息接受者轮训获得信息,用一个队列(queue)接受消息,队列的容量大小可配置.
    • PriorityChannel 可按照优先级将数据存储到队列,依据消息的消息头priority属性.
    • RendezvousChannel 确保每一个接受者都解说道消息后再发送消息. rendezvous(约会)
    • DirectChannel 默认,允许将消息发送给为一个订阅者,然后阻碍发送直到消息被接受.
    • ExecutorChannel 可绑定一个多线程task executor.
  • 通道拦截器 ChannelInterceptor
    参考文章

9.4.4 Message EndPoint

消息端点(Message EndPoint)是真正处理消息的(Message)组件,它还可以控制通道的路由.

  • Channel Adapter 通道适配器 是一种连接外部系统或传输协议的端点(EndPoint),可以分为入站(inbound)和出站(outbound).
    通道适配器是单向的,入站通道适配器只支持接收消息,出站通道适配器只支持输出消息
  • Gateway 消息网关 类似于Adapter,但是提供了双向的请求/返回集成方式,也分为入站(inbound)和出站(outbound).Spring Integration 对响应的Adapter都提供了Gateway.
  • Service Activator 可调用Spring的Bean来处理消息,并将处理后的结果输出到指定的消息通道。
  • Router 路由 可根据消息体内容(Payload Type Router)、消息头的值(Header Value Router) 以及定义好的接收表(Recipient List Router) 作为条件,来决定消息传递到的通道
  • Filter 过滤器 类似于路由(Router),不同的是过滤器不决定消息路由到哪里,而是决定消息是否可以传递给消息通道。
  • Splitter 拆分器 将消息拆分为几个部分单独处理,拆分器处理的返回值是一个集合或者数组
  • Aggregator 聚合器与拆分器相反,它接收一个Java.util.List作为参数,将多个消息合并为一个消息。
  • Enricher 当我们从外部获得消息后,需要增加额外的消息到已有的消息中,这时就需要使用消息增强器(Enricher)。消息增 强器主要有消息体增强器(Payload Enricher)和消息头增强器(Header Enricher)两种
  • Transformer 转换器是对获得的消息进行一定的转换处理(如数据格式转换).
  • Bridge 使用连接桥可以简单的将两个消息通道连接起来。

9.4.5 Spring Integration Java DSL

通过IntegrationFlow来定义系统集成流程,通过IntegrationFlows和IntegrationFlowBuilder来实现使用FluentAPI.

9.4.6 实战

源码:/ch9_4

10.Spring Boot开发部署与测试

模板引擎默认开启缓存,如果关闭

spring.thymeleaf.cache=false 

10.1 开发的热部署

10.1.1 模板热部署

10.1.2 Spring Loaded

下载地址: 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

springloaded-热部署.png

VM arguments的参数值如下:

//其中路径为jar包所在路径,注意路径不要空格
-javaagent:D:/work/jars/springloaded-1.2.7.RELEASE.jar  -noverify   

参考文章

10.1.3 JRebel

收费的版本.暂时不试了.

10.1.4 spring-boot-devtools

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>1.5.6.RELEASE</version>
</dependency>

10.2 常规部署

10.2.1 jar形式

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

10.2.2 注册为linux服务

10.2.2.1 注册为init.d服务
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   //开机启动
10.2.2.2 基于linux的Systemd部署
/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     //项目日志

10.2.3 war形式

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;

10.3 云部署-基于Docker的部署

详情看book吧.

10.4 SpringBoot的测试

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
    }

}

11.Spring 应用监控

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

参考文章

11.1 http

11.1.1 列表

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>1.5.6.RELEASE</version>
</dependency>
http://localhost:8080/actuator


//shudown默认是关闭的,打开开关配置如下:
//shutdown 不支持get方式,需要用post方式
endpoints.shutdown.enabled=true //开启某个端点
endpoints.enabled=false //关闭所有的端点

11.1.2 定制端点

自定义访问端点名称:

配置后可以通过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访问

11.1.3 自定义端点

源码: /ch11_1
DemoApplication.java 
StatusService.java 
StatusEndPoint.java

11.1.4 自定义HealthIndicator

//查看系统健康情况
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是否正常运行

11.2 JMX

java内置的jconsole,通过cmd来执行只有,然后选择java进程,随后查看

11.3 SSH

项目中依赖Romote Shell(spring-boot-starter-remote-shell),启动之后控制台会有连接密码.通过ssh连接工具连接(用户名为user).

  • 常用linux命令
help
metrics
endpoint list
endpoint invoke health
//自定义ssh连接的用户及密码,在application.properties中
shell.auth.simple.user.name=username
shell.auth.simple.user.password=123456
  • 自定义命令
    /ch11_3

12.分布式系统开发

12.1 微服务,原生云应用

12.2 Spring Cloud快速入门

12.2.1 配置服务

Config Server

12.2.2 服务发现

Netflix OSS的Eureka

@EnableEurekaServer //服务端
@EnableEurekaClient //客户端

12.2.3 路由网关

Zuul

@EnableZuulProxy

12.2.4 负载均衡

Ribbon和Feign

@FeignClient

12.2.5 断路器(Circuit Breaker)

@EnableCircuitBreaker

12.3 实战

源码/ch12

12.4 基于Docker部署

Spring Cloud和Docker会另外学习.此处略过.

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值