3.剖析SpringMVC处理请求数据
[toc]
[toc]
SpringMVC处理请求数据
Spring MVC 通过分析处理方法的签名(方法名+ 参数列表),HTTP请 求信息绑定到处理方法的相应形参中。
Spring MVC 对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名。
必要时可以对方法及方法入参标注相应的注解( @PathVariable 、@RequestParam、@RequestHeader 等)
Spring MVC 框架会将 HTTP 请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。
1. @RequestParam注解
我们只需要将参数的名字添加到方法的形参上就可以了 @RequestParam 用于映射请求参数。
通过value这个属性指定将请求中的参数的值给到对应的方法的形参中。
默认情况下,使用@RequestParam注解指定的参数必须要从request对象中获取到,如果找不到,会报错:Required String parameter 'name' is not present
可以通过requir ...
2.@RequestMapping注解
[toc]
@RequestMapping注解
映射请求注解**@RequestMapping**—为控制器指定可以处理哪些 URL请求。
在控制器的类和方法中都可以使用。
标记在类上:提供初步的请求映射信息。相对于 WEB 应用的根目录
标记在方法上:提供进一步的细分映射信息。相对于标记在类上的 URL。
作用:DispatcherServlet 截获请求后,就通过控制器上 @RequestMapping 提供的映射信息确定请求所对应的处理方法。
@RequestMapping 除了可以使用请求 URL 映射请求外,还可以使用请求方法、请求参数及请求头映射请求!
1. value属性
请求 URL
12345678/** * map.put("hello",cn.justweb.HelloWorldController.hello); * */@RequestMapping(value = "/hello" )public String hello(){ System.out.println("Hell ...
1.SpringMVC概述
[toc]
1. SpringMVC概述
一种轻量级的、基于MVC的Web层应用框架。偏前端而不是基于业务逻辑层,Spring框架的一个后续产品。是目前最主流的MVC 框架之一
SpringMVC 3.0 后全面超越 Struts2,成为最优秀的 MVC 框架。
Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口。
支持 REST 风格的 URL 请求。 Restful
采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
1.1 SpringMVC应用范围
天生与Spring框架集成,如:(IOC,AOP)
进行更简洁的Web层开发
支持灵活的URL到页面控制器的映射
非常容易与其他视图技术集成,如:Velocity、FreeMarker等等
因为模型数据不存放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用)
非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的A ...
10.SpringMVC之异常处理
SpringMVC之异常处理
Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射、数据绑定以及目标方法执行时发生的异常。
SpringMVC 提供的 HandlerExceptionResolver 的实现类 ?
异常处理DefaultHandlerExceptionResolver对一些特殊的异常进行处理,比如:
NoSuchRequestHandlingMethodException、
HttpRequestMethodNotSupportedException、
HttpMediaTypeNotSupportedException、
HttpMediaTypeNotAcceptableException等。
异常处理SimpleMappingExceptionResolver
如果希望对所有异常进行统一处理,可以使用 SimpleMappingExceptionResolver,它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常
SpringMVC提供了很多异常处理器,我们需要在sp ...
7.SpringCloud组件之Zuul
[toc]
Zuul网关通过前面的学习,使用Spring Cloud实现微服务的架构基本成型,大致是这样的:
我们使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现;而服务间通过Ribbon或Feign实现服务的消费以及均衡负载。为了使得服务集群更为健壮,使用Hystrix的融断机制来避免在微服务架构中个别服务出现异常时引起的故障蔓延。
在该架构中,我们的服务集群包含:内部服务Service A和Service B,他们都会注册与订阅服务至Eureka Server,而Open Service是一个对外的服务,通过均衡负载公开至服务调用方。我们把焦点聚集在对外服务这块,直接暴露我们的服务地址,这样的实现是否合理,或者是否有更好的实现方式呢?
先来说说这样架构需要做的一些事儿以及存在的不足:
破坏了服务无状态特点。
为了保证对外服务的安全性,我们需要实现对服务访问的权限控制,而开放服务的权限控制机制将会贯穿并污染整个开放服务的业务逻辑,这会带来的最直接问题是,破坏了服务集群中REST API无状态的特点。
从具体开发和测试的角度来 ...
6.SpringCloud组件之Hystrix
[toc]
Hystrix1. 背景分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。并且这种不可用可能沿请求调用链向上传递,这种现象被称为雪崩效应。
1.1 雪崩效应常见场景
硬件故障:如服务器宕机,机房断电,光纤被挖断等。
流量激增:如异常流量,重试加大流量等。
缓存穿透:一般发生在应用重启,所有缓存失效时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端服务,造成服务提供者超负荷运行,引起服务不可用。
程序BUG:如程序逻辑导致内存泄漏,JVM长时间FullGC等。
同步等待:服务间采用同步调用模式,同步等待造成的资源耗尽。
1.2 雪崩效应应对策略针对造成雪崩效应的不同场景,可以使用不同的应对策略,没有一种通用所有场景的策略,参考如下:
硬件故障:多机房容灾、异地多活等。
流量激增:服务自动扩容、流量控制(限流、关闭重试)等。
缓存穿透:缓存预加载、缓存异步加载等。
程序BUG:修改程 ...
5.SpringCloud组件之Feign
[toc]
SpringCloud组件之Feign
在前面的学习中,我们使用了Ribbon的负载均衡功能,大大简化了远程调用时的代码:String user = this.restTemplate.getForObject("http://service-provider/user/" + id, String.class);
如果就学到这里,你可能以后需要编写类似的大量重复代码,格式基本相同,无非参数不一样。有没有更优雅的方式,来对这些代码再次优化呢?
学习完Feign之后就可以修改代码生成器的模板来生成我们需要的代码了
1. Feign简介
Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
项目主页:https://github.com/OpenFeign/feign
Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、 JAXRS-2.0以及WebSocket。Feign 可帮助我们更加便捷、 ...
4.SpringCloud组件之Ribbn
[toc]
Ribbon
我们启动了一个justweb-service-provider,然后通过DiscoveryClient来获取服务实例信息,然后获取ip和端口来访问。
但是实际环境中,我们往往会开启很多个justweb-service-provider的集群。此时我们获取的服务列表中就会有多个,到底该访问哪一个呢?
一般这种情况下我们就需要编写负载均衡算法,在多个实例列表中进行选择。
Eureka中已经帮我们集成了负载均衡组件:Ribbon,简单修改代码即可使用。
1. Ribbn简介
轮询
随机
2. 启动两个服务实例
首先参照justweb-eureka启动两个justwebServiceProviderApplication实例,一个8081,一个8082。
Eureka监控面板:
3. 开启负载均衡
因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖,直接修改代码。修改justweb-service-consumer的引导类,在RestTemplate的配置方法上添加@LoadBalanced注解
12345@Bean@Loa ...
3.实现Eureka高可用
[toc]
高可用的Eureka Server
Eureka Server即服务的注册中心,在刚才的案例中,我们只有一个EurekaServer,事实上EurekaServer也可以是一个集群,形成高可用的Eureka中心。
1. 服务同步
多个Eureka Server之间也会互相注册为服务,当服务提供者注册到Eureka Server集群中的某个节点时,该节点会把服务的信息同步给集群中的每个节点,从而实现数据同步。因此,无论客户端访问到Eureka Server集群中的任意一个节点,都可以获取到完整的服务列表信息。
2. 搭建高可用的EurekaServer
我们假设要运行两个EurekaServer的集群,端口分别为:10086和10087。只需要把justweb-eureka启动两次即可。
2.1 启动第一个eurekaServer
所谓的高可用注册中心,其实就是把EurekaServer自己也作为一个服务进行注册,这样多个EurekaServer之间就能互相发现对方,从而形成集群。因此我们做了以下修改:
把service-url的值改成了另外一台EurekaServe ...
2.SpringCloud组件之Eureka
[toc]
Eureka注册中心1. 简介
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务 ...