Spring Boot

Spring Boot遵循“约定优于配置”原则,大部分可以使用默认配置。
Spring Boot本身默认的执行方式是单线程同步执行,并行需手动配置参数。

spring-boot文档
https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/

运行TEST:打开Test代码文件,右键或run菜单中就变成test了。

SpringBoot开发详解(一)--初识SpringBoot
http://docs.spring.io/spring-boot/docs/current/reference/html/

RestTemplate

Spring Boot提供了RestTemplate来发起REST请求,RestTemplate提供了REST风格的api,默认通过JDK自带的HttpUrlConnection作为底层的HTTP发送方式,使用Jackson来序列化Json数据。
RestTemplate 调用传参
http://blog.csdn.net/itlqi/article/details/49592985
url路径可以加入路径参数{参数名}格式,在传参数时可以传Map或数组或其它类型。

如果期望调用结果返回List,则不能简单调用xxxForObject,因为存在泛型的类型擦除,RestTemplate在反序列化时不知道实际类型,这时需要使用ParameterizedTypeReference来包含泛型类型,并通过exchange通用接口来调用。
RestTemplate.getForObject将PO中List的泛型变成了LinkedHashMap,造成ClassCastException。可以使用exchange 基础调用接口代替getForObject来解决问题。

ResponseEntity<List<AreaProto>> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<AreaProto>>() {});
List<AreaProto> areas=responseEntity.getBody();

注意到创建ParameterizedTypeReference的对象是用{}结束的,因为这里是创建了一个ParameterizedTypeReference的子类,依据在类定义中的泛型信息保留的原则,子类对象保留了期望返回的泛型List。
除了使用ParameterizedTypeReference来保留泛型信息,还可以通过getForObject先映射成String,再通过Jackson ObjectMapper转为指定类型。

相比getForObject,getForEntity返回信息中包含了HTTP头信息。


通过 Spring RestTemplate 调用带请求体的 Delete 方法(Delete With Request Body)
https://www.cnblogs.com/snake-hand/p/3151391.html

定制RestTemplate,通过实现RestTemplateCustomizer接口,并声明为配置类,在其中可以对RestTemplate的参数进行全局设置。还可以通过添加okhttp的依赖来使用okhttp来作为底层http发送方式。


Swagger

WebService提供了WSDL来描述提供的WS调用接口,还提供了其它工具来生成WS客户端代码。REST则可以使用Swagger规则来描述Restful接口,以及通过Swagger UI来测试Restful接口。

Swagger2是通过在接口上提供一系列注解来描述接口,而Swagger3则是通过一个swagger规范的json文件来描述。

Swagger使用指南
https://my.oschina.net/dlam/blog/808315
swagger2常用注解说明
https://blog.csdn.net/u014231523/article/details/76522486

Spring boot项目,使用maven打包包含本地jar
http://www.jianshu.com/p/4f88837945c9


缓存

Spring Boot 通过方法注解的方式使用统一的缓存。
@CachePut 注释可以确保方法被执行,同时方法的返回值也被记录到缓存中。
@CacheEvict 注释将缓存数据删除,可以指定一个或多个缓存。提供参数allEntries表示是否需要清除缓存中的所有元素,默认为false。当指定了allEntries为true时,Spring Cache将忽略指定的key。属性 beforeInvocation,缺省值为 false,即在实际的方法执行完成后,才对缓存进行清空操作。如果执行方法出现异常,则会导致缓存清空不被执行。


@Cacheable 标注的方法,如果其所在的类实现了某个接口,那么该标注所在方法也必须是接口里面的方法,否则cache无效。因为Spring把实现类装载为Bean时会用代理包装,所以从Spring Bean的角度看,只有接口里面的方法是可见的。
解决办法:把待cache的方法移到接口里面,或者把@Cacheable标注在一个没有实现任何接口的类的public方法上。因为这种Bean也被Spring产生了代理, 看得到的只有public方法。
Spring 在执行 @Cacheable 标注的方法前先查看缓存中是否有数据,如果有则直接返回缓存数据,不再执行方法体;若没有数据,执行该方法并将方法返回值放进缓存。
@Cacheable 支持的参数有:
value:缓存区名称,不能为空。理解为表。
key:缓存的key,默认为空。理解为记录的id。
condition:触发条件,只有满足条件的情况才会加入缓存,默认为空。
unless:用来决定是否添加到缓存。与condition不同的是,unless表达式是在方法调用之后进行评估的。如果返回false,才放入缓存(与condition相反)。

#result指返回值 例:
@Cacheable(value="DeviceRecords", key = "#deviceCode", unless="#result == null")
    public DeviceRecord getDeviceByCode(String deviceCode){
        return deviceRecordRepository.findOneByCode(deviceCode);
}


Spring Cloud

Spring官方在spring boot的基础上,提供了一个名为Spring Cloud的开源项目,它是对Netflix开源组件进一步封装的一套云应用开发工具。
Netflix公司和Pivotal公司:

Netflix是一家视频网站,该网站上的美剧应该是最火的。Netflix的微服务大规模的应用,在技术上毫无保留的把一整套微服务架构核心技术栈开源了出来,叫做Netflix OSS。Pivotal在Netflix开源的一整套核心技术产品线的基础上,做了一系列的封装,就变成了Spring Cloud。Spring Cloud到现在为止不只有Netflix提供的方案可以集成,但Netflix是最成熟的。
Pivotal公司:Spring以及衍生框架、做缓存Redis、消息队列框架RabbitMQ、还有更牛的Greenplum,这些都是Pivotal公司的。还有Tomcat、Groovy里的一些顶级开发者,DevOps理论的提出者都在这个公司。Pivotal的Gemfire技术来解决尖峰高流量并发问题,才让12306刷票体验明显提升。


《Spring Cloud微服务实战》
http://blog.didispace.com/
http://blog.csdn.net/forezp/article/details/70148833
http://blog.csdn.net/u010066934/article/details/54232622

Spring Cloud 文档
http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_features

PiggyMetrics微服务编译运行解析
http://blog.csdn.net/nihaomanihao11/article/details/73822681
http://blog.csdn.net/rickiyeat/article/details/60792925

Spring Cloud微服务架构中的几个基础服务治理组件:
服务注册中心:Eureka Server
注册服务:Eureka Client
发现服务:Discovery Client
负载均衡:Load Balance、RestTemplate、Ribbon,Feign
断路器:Hystrix,另外Feign自带断路器功能,断路打开后,可以避免连锁故障,fallback方法可以直接返回一个固定值。
路由网关转发和过滤器:zuul,zuul还能过滤做一些安全验证,zuul默认和Ribbon结合实现了负载均衡的功能。Zuul是Netflix 提供的一个开源组件,致力于在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。
分布式配置中心:spring cloud config,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。两个角色,config server config client。
消息总线(Spring Cloud Bus):将分布式节点加入消息总线,利用轻量的消息代理(message broker 经纪人)使得应用程序可以高效地解耦通信过程。在众多的开源消息中间件产品中,当前版本的spring cloud bus仅支持两款中间件产品:rabbitmq和kafka两个binder,也可以自己写binder扩展。

Api gateway:
微服务场景下,将细粒度的服务组合起来提供一个粗粒度的服务,所有请求都导入一个统一的入口,那么整个服务只需要暴露一个api,对外屏蔽了服务端的实现细节,也减少了客户端与服务器的网络调用次数。与业务关系并不大的通用处理逻辑可以从api gateway中剥离出来,api gateway仅仅负责服务的编排与结果的组装。这样对一些后端微服务进行了代理,避免了各个后端服务独立管理CORS和验证问题。

zuul静态路由配置规则:
分布式系统中未使用注册服务时,service1的名称可更换,下面的配置中.path中的**会被添加到.url的后面。若不配置.url,可直接使用service1作为请求路径。

zuul.routes.service1.url=http://localhost:8002/storage/
zuul.routes.service1.path=/proxy/**

动态路由
动态路由需要达到可持久化配置和动态刷新的效果。即不仅要能满足从spring的配置文件properties加载路由信息,还需要从数据库加载配置。另外一点是,在容器启动后,能动态刷新内存中的路由信息,达到不停机维护路由信息的效果。


Spring Boot消息支持

Spring对JMS和RabbitMQ的支持分别提供了JmsTemplate和RabbitTemplate来发送消息,提供了@JmsListener、@RabbitListener注解在方法上监听消息代理发布的消息,分别需要通过@EnableJms和@EnableRabbit来开启支持。
Spring Boot进一步自动配置开启了对@EnableJms、@EnableRabbit、JmsTemplate、RabbitTemplate的支持,在application.properties中分别以spring.activemq和spring.rabbitmq来配置所需的属性。


Spring Security

对Spring Security的理解:把对REST资源的访问权限与用户角色关联,即Spring Security根据用户角色控制当前登录用户是否可以访问这个REST URL。
permitAll()允许请求没有任何的安全限制。authenticated()要求在执行该请求时必须已登录。另外,authorizeRequests()方法返回的对象还有更多的方法用于细粒度地保护请求。
自定义处理请求过滤可以使用FilterRegistrationBean:

@Bean
public FilterRegistrationBean jwtFilterRegistrationBean(){
        HttpAuthFilter httpAuthFilter=new HttpAuthFilter();
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(httpAuthFilter);
        registrationBean.setUrlPatterns(httpAuthFilter.getUrlPatterns());

        return registrationBean;
}

重拾后端之Spring Boot(四):使用JWT和Spring Security保护REST API
https://www.jianshu.com/p/6307c89fe3fa
Spring Security(01)——初体验
http://elim.iteye.com/blog/2154299
SpringSecurity学习笔记之四:拦截请求
http://blog.csdn.net/zhoucheng05_13/article/details/60467234


查看tomcat版本

工程中pom文件中parent标签中指定了父级依赖,它用来提供相关的Maven默认依赖。例如要查看Spring Boot 1.5.1 默认提供了哪些依赖,可查看.m2\repository\org\springframework\boot\spring-boot-dependencies\1.5.1.RELEASE\spring-boot-dependencies-1.5.1.RELEASE.pom。
可以在工程中覆盖tomcat版本:

<properties> 
 <tomcat.version>8.0.29</tomcat.version> 
</properties>


application.properties

使用${变量名}在 application.properties 中引用变量。
还可以自定义 application.properties 进行外部配置。

在容器启动的时候执行一些内容

在容器启动的时候执行一些内容,比如:读取配置文件信息,数据库连接,删除临时文件,清除缓存信息,在Spring框架下是通过ApplicationListener监听器来实现的。在Spring Boot中给我们提供了两个接口来帮助我们实现这样的需求:CommandLineRunner和ApplicationRunner,他们的执行时机是在容器启动完成的时候。
Spring Boot之CommandLineRunner和ApplicationRunner【从零开始学Spring Boot】
https://blog.csdn.net/gebitan505/article/details/55047819

WebMvcConfigurer

WebMvcConfigurer接口用来全局定制Spring boot的Mvc特性,可以通过实现这个接口,并声明为java配置@Configuration, 来配置一些特性。例如拦截器、跨域访问、类型转换、以及注册Controller。

验证框架

JSR-303是java标准的验证框架,它定义了一系列注解用来验证Bean的属性,Hibernate Validator实现了这个标准。
在Controller中,在方法的对象参数前加上@Validated注解可触发校验。


jackson

Spring boot内置了jackson来完成JSON的序列化和反序列化操作。jackson是一个流行的高性能javabean(pojo)到json的绑定工具,它使用ObjectMapper来完成。json到pojo称为反序列化,Pojo到json称为序列化。
另外,Fastjson是阿里提供的。
有三种层次的序列化方式:底层方式、树遍历方式、绑定方式。
使用以下方式影响全局,可能会导致一些转换失败而使请求失败。

@Bean
  public ObjectMapper getObjectMapper(){
      ObjectMapper objectMapper=new ObjectMapper();
      objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

      return objectMapper;
  }

使用jackson注解,可以用来个性序列化操作。例如:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
Date createTime;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值