Spring WebFlux 是 Spring Framework 5.0中引入的新的响应式web框架。与Spring MVC不同,它不需要Servlet API,是完全异步且非阻塞的,并且通过Reactor项目实现了Reactive Streams规范。
安装简易教程(适用 Mac/Linux)
下载安装包 redis-x.x.x.tar.gz
tarzxvfredis-2.8.17.tar.gz
redis-x.x.x/make
srcredis-server
如果需要运行在守护进程,设置 daemonize 从 no 修改成 yes,并指定运行:redis-server redis.conf
类似上面讲的工程搭建,新建一个工程编写此案例。工程如图:
目录核心如下
pom.xml maven 配置
application.properties 配置文件
domain 实体类
controller 控制层,本文要点
新增 POM 依赖与配置
在 pom.xml 配置新的依赖:
org.springframework.bootspring-boot-starter-data-redis-reactive
类似 MongoDB 配置,在 application.properties 配置连接 Redis :
## Redis 配置
spring.redis.host=127.0.0.1spring.redis.port=6379##Redis服务器连接密码(默认为空)spring.redis.password=spring.redis.timeout=5000
默认 密码为空,这里注意的是连接超时时间不能太少或者为 0 ,不然会引起异常 RedisCommandTimeoutException: Command timed out。
修改 org.spring.springboot.domain 包里面的城市实体对象类。城市(City)对象 City,代码如下:
importorg.springframework.data.annotation.Id;importjava.io.Serializable;/***城市实体类**/publicclassCityimplementsSerializable{privatestaticfinallongserialVersionUID=-2081742442561524068L;/***城市编号*/@IdprivateLongid;/***省份编号*/privateLongprovinceId;/***城市名称*/privateStringcityName;/***描述*/privateStringdescription;publicLong(){id;}publicvoidsetId(Longid){this.id=id;}publicLong(){provinceId;}publicvoidsetProvinceId(LongprovinceId){this.provinceId=provinceId;}publicString(){cityName;}publicvoidsetCityName(StringcityName){this.cityName=cityName;}publicString(){description;}publicvoidsetDescription(Stringdescription){this.description=description;}}
值得注意点:
@Id 注解标记对应库表的主键或者唯一标识符。因为这个是我们的 DO ,数据访问对象一一映射到数据存储。
City 必须实现序列化,因为需要将对象序列化后存储到 Redis。如果没实现 Serializable ,会引出异常:java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type
如果不是用默认的序列化,需要自定义序列化实现,只要实现 RedisSerializer 接口去实现即可,然后在使用 RedisTemplate.setValueSerializer 方法去设置你实现的序列化实现。支持 JSON、XML 等。
代码如下:
importorg.spring.springboot.domain.City;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.core.ValueOperations;importorg.springframework.web.bind.annotation.*;importreactor.core.publisher.Mono;importjava.util.concurrent.TimeUnit;@RestController@RequestMapping(value=)publicclassCityWebFluxController{@AutowiredprivateRedisTemplateredisTemplate;@GetMapping(value=)publicMonofindCityById(@PathVariable()Longid){Stringkey=+id;ValueOperationsoperations=redisTemplate.opsForValue(); booleanhasKey=redisTemplate.hasKey(key); Citycity=operations.get(key);(!hasKey){Mono.create(monoSink->monoSink.success(null)); }Mono.create(monoSink->monoSink.success(city)); } @PostMapping() publicMonosaveCity(@RequestBodyCitycity){ Stringkey=+city.getId(); ValueOperationsoperations=redisTemplate.opsForValue(); operations.set(key,city,60,TimeUnit.SECONDS);Mono.create(monoSink->monoSink.success(city)); } @DeleteMapping(value=) publicMonodeleteCity(@PathVariable()Longid){ Stringkey=+id; booleanhasKey=redisTemplate.hasKey(key);(hasKey){ redisTemplate.delete(key); }Mono.create(monoSink->monoSink.success(id)); } }
使用 @Autowired 注入 RedisTemplate 对象。这个对象和 Spring 的 JdbcTemplate 功能十分相似,RedisTemplate 封装了 RedisConnection,具有连接管理、序列化和各个操作等。还有针对 String 的支持对象 StringRedisTemplate。
删除 Redis 某对象,直接通过 key 值调用 delete(key)。
Redis 操作视图接口类用的是 ValueOperations,对应的是 Redis String/Value 操作。get 是获取数据;set 是插入数据,可以设置失效时间。这里设置的失效时间是 60 s。
还有其他的操作视图,ListOperations、SetOperations、ZSetOperations 和 HashOperations 。
一个操作 Redis 工程就开发完毕了,下面运行工程验证下。使用 IDEA 右侧工具栏,点击 Maven Project Tab ,点击使用下 Maven 插件的 install 命令。或者使用命令行的形式,在工程根目录下,执行 Maven 清理和安装工程的指令:
springboot-webflux-6-redismvncleaninstall在控制台中看到成功的输出:...省略[INFO]------------------------------------------------------------------------[INFO]BUILDSUCCESS[INFO]------------------------------------------------------------------------[INFO]TotAltime:01:30min[INFO]Finishedat:2018-10-15T10:00:54+08:00[INFO]FinalMemory:31M/174M[INFO]------------------------------------------------------------------------在IDEA中执行Application类启动,任意正常模式或者Debug模式。可以在控制台看到成功运行的输出:...省略2018-04-1008:43:39.932INFO2052---[ctor-http-nio-1]r.ipc.netty.tcp.BlockingNettyContext:StartedHttpServeron/0:0:0:0:0:0:0:0:80802018-04-1008:43:39.935INFO2052---[main]o.s.b.web.embedded.netty.NettyWebServer:Nettystartedonport(s):80802018-04-1008:43:39.960INFO2052---[main]org.spring.springboot.Application:StartedApplication6.547seconds(JVMrunning9.851)
打开 POST MAN 工具,开发必备。进行下面操作:
新增城市信息 POST
获取城市信息 GET
如果等待 60s 以后,再次则会获取为空。因为保存的时候设置了失效时间是 60 s。

spring boot支持win10吗
好用。 在MacBook上装win10的体验是与在win下的win10一样的应用在Mac上安装Windows,基本上可以通过两种方式来实现:虚拟机及双系统。 方法一:Mac虚拟机安装Win10系统方法首先下载ISO文件,虚拟机的选择包括VirtualBox、VMware等,这里以VirtualBox为例进行说明。 整体的安装并不复杂,就像使用一款Mac软件一样,按照步骤选择系统版本(由于Windows 10并未正式推出,需要选择Windows 8,包括32位及64位版本)。 然后,VirtualBox会分配多少RAM给Windows,默认为2048MB,可以根据自己Mac的硬件来分配。 存储方面,需要划分一个虚拟硬盘给Windows,默认为25GB,同样可以自行调节。 之后,选择ISO,就可以像在PC上安装Windows那样进行安装,需要注意的是要选择全新安装而非升级。 安装完毕之后,就可以在虚拟窗口中正常使用Windows 10预览版了,当然也支持全屏效果。 方法二:使用Boot Camp安装Win10如果喜欢更传统的形式,那么就可以使用Boot Camp工具来安装Windows 10了。 首先,需要将ISO制作成一个可引导U盘,然后在Mac中找到Boot Camp工具,为Windows分配硬盘空间,建议选择至少20GB的空间。 然后,Boot Camp会重启系统,进入Windows安装界面,之后的步骤就与在PC上安装基本一致了。 重启之后,按住键盘的Option按键,就可以在Mac及Windows 10中进行选择。 总得来说,Win10目前还处于预览版阶段,不过在Mac设备上的兼容性还是不错的,触摸板可以实现大量高效的操作,不过还是使用鼠标更舒服一些。 不兼容的部分主要集中在屏幕亮度自动调节、Macbook的键盘背光等方面。
看Spring-cloud怎样使用Ribbon
关注下spring cloud是如何进行客户端负责均衡。 看怎么调用到负载均衡的,怎么定义负载均衡的,然后是怎么实现的?第一个其实可以不用关心,调用的地方应该很多,找到一个地方来说明怎么调用的即可。 第二个,可以猜下,最主要的应该是一个类似 serviceInstance get(string serviceId)这样的方法吧。 第三个问题,明摆着,使用netflix的ribbon呗。 发起一个调用时,LB对输入的serviceId,选择一个服务实例。 IOException {String serviceId = ();ServiceInstanceinstance = (serviceId);URIuri = (instance, originalUri);IClientConfigclientConfig = (());RestClientclient = ((), ); = (());return new RibbonHttpRequest(uri, verb, client, clientConfig);}关键代码看到调用的是一个LoadBalancerClient的choose方法,对一个serviceId,选择一个服务实例。 看下LoadBalancerClient是一个接口:足够简单,只定义了三个方法,根据一个serviceId,由LB选择一个服务实例。 reconstructURI使用Lb选择的serviceinstance信息重新构造访问URI,能想来也就是用服务实例的host和port来加上服务的路径来构造一个真正的刘访问的真正服务地址。 可以看到这个类定义在的package 下面,满篇不见ribbon字样。 只有loadbalancer,即这是spring-cloud定义的loadbalancer的行为,至于ribbon,只是客户端LB的一种实现。 Ribbon的实现定义在中的包下的RibbonLoadBalancerClient。 看下RibbonLoadBalancerClient中choose(String serviceId)方法的实现。 (String serviceId)@Overridepublic ServiceInstancechoose(String serviceId) {Serverserver = getServer(serviceId);return new RibbonServer(serviceId, server, isSecure(server, serviceId),serverIntrospector(serviceId)(server));}看到,最终调到的是ILoadBalancer的chooseServer方法。 即netflix的LB的能力来获取一个服务实例。 protected ServergetServer(String serviceId) {return getServer(getLoadBalancer(serviceId));}protected ServergetServer(ILoadBalancerloadBalancer) {return (“default”); ofkey}至于netflix如何提供这个能力的在另外一篇博文中尝试解析下。
启动spring boot报错,怎么解决
【解决办法】需要在启动类的@EnableAutoConfiguration或@SpringBootApplication中添加exclude = {},排除此类的autoconfig。 启动以后就可以正常运行。 【原因】这个原因是maven依赖包冲突,有重复的依赖。 【Spring Boot】Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。 通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
发表评论