学习springcloud的一些心得体会——老卫的天气预报系统

Posted 梦回的承诺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习springcloud的一些心得体会——老卫的天气预报系统相关的知识,希望对你有一定的参考价值。

1:建立天气预报springboot系统

首先先建立一个天气预报的springboot系统,具体流程如下:

(1)从cityList.xml中获取城市信息,

(2)然后根据下面的链接获取各个城市的天气预报信息,缓存在redis中,天气预报信息半个小时同步一次

http://wthrcdn.etouch.cn/weather_mini?citykey=

http://wthrcdn.etouch.cn/weather_mini?city=

(3)用thymeleaf建立report的页面,控制器,去redis获取天气信息

2:由springboot转换成springcloud,拆分天气预报项目到spingcloud模式

springcloud:Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。springcloud说白了就是多个springboot工程

天气预报系统就拆分为四个工程,分别是:

(1)城市数据工程(主要是更新城市数据列表,以方便让其他工程获取城市信息)

(2)天气数据采集同步工程(主要是获取全部城市的天气信息,然后同步到redis数据库中,并每隔半个小时更新数据)

(3)天气数据获取API工程(就是通过编写控制器写两个方法,根据城市id和根据城市名称获取城市天气信息)

(4)天气预报报告工程(通过获取城市数据信息以及天气数据获取API,实现数据的展示)

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

 

3:注册发现—— eureka,使上一步骤拆分的天气预报工程真正变成springcloud工程

eureka:

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将会从服务注册表中把这个服务节点移除(默认90秒)。

Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

 

总的思想:建立euraka注册服务器,然后把天气预报系统的各个自工程注册在eureka服务器上,执行程序

(1)eureka注册服务器工程搭建

第一步:引入eureka服务端和springcloud架包

第二步:修改application配置

第三步:在启动类中增加启动eureka服务器配置

 

第四步:启动程序,开启eureka服务器

 

(2)修改天气预报四个子工程,然后注册到eureka服务器中

四个子工程改造差不多,我就随便举一个,就举例天气预报数据采集同步工程吧

第一步:添加springcloud和eureka客户端架包

(2)修改application配置:配置了该工程注册在eureka服务器上的工程名以及注册服务器的地址

(3)在启动类中增加启动eureka客户端配置

 

(4)启动客户端程序,该子工程就会注册在服务器上

4:服务之间调用——feigh

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。

Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。

https://www.jianshu.com/p/94177e224ef8

总的来说就是在天气预报四个子工程之间互相调用接口,同时实现负载均衡

第一点:天气预报采集同步系统需要调用城市信息系统的信息

第二点:天气预报预报系统需要调用城市信息系统的信息,以及天气预报获取Api系统信息

所以我们总的改造就是天气预报采集系统和天气预报预报系统

(1)两个子系统改造,都一样,我就举例天气预报采集同步系统

第一步:增加feigh架包

第二步:增加feigh的配置

第三步:在启动类中增加启动feigh的配置

第四步:新增调用城市列表service

第五步:在job任务中调用上一步的service

(2)启动服务器和客户端,

执行report显示天气的时候,feigh自动会实现负载均衡,执行其中调用务中的一个

(3)特别注意点:关于天气预报采集和同步中定时任务项目启动不同步,到了下一个间隔点才同步的问题

主要是springcloud的一些启动项妨碍了同步定时任务的执行,具体可以看下面的博客的解决,我之前也纠结了很久

https://my.oschina.net/ouminzy/blog/3080261

 

5:API网关——zuul

Zuul包含了对请求的路由和过滤两个最主要的功能:是路由网关

其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础.

Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得.

注意:Zuul服务最终还是会注册进Eureka

提供=代理+路由+过滤三大功能)

总的来说,之前的feigh+eureka已经实现springcloud的功能,为了在服务之间调用统一起来,需要使用zuul来生成统一的API网关

主要的项目格式是,我们主要改造天气预报报告项目,同时我们还要注册一个zuul网关客户端:

(1)生成zuul网关客户端

第一步:新建zuul项目,导入zuul架包

第二步:添加配置,包括注册eureka的地址,注册的名称,API网关的名称,以及API网关对用的服务的名称

第三步:启动类配置zuul的配置

 

(2)改造天气预报报告项目

第一步:直接修改dataservice就好

 

6:熔断机制——hystrix

Hystrix是一个为服务关于服务保护的框架,是Netflix开源的一款针对分布式系统的延迟和容错解决框架,目的是用来隔离分布式服务故障.它提供线程和信号隔离,以减少不同服务之间的资源竞争带来的相互影响;提供熔断机制使得服务可以快速失败,而不是一直阻塞等待服务响应,并能从中快速恢复.Hystrix通过这些机制来阻止级联失败并保证系统弹性,可用.

https://www.jianshu.com/p/8f85e8064ad6

主要改造天气预报报告系统

第一步:添加hystrix的架包

第二步:修改application文件

第三步:修改启动类添加hystrix配置

第四步:添加熔断代码在dataservice中

第五步:修改thymeleaf页面代码,让熔断没有值得时候前端不报错,提示系统不可用

7:配置中心-config(介绍,不和天气预报系统有关)

Spring Cloud Config是一个解决分布式系统的配置管理方案,为分布式系统外部化配置提供了支持,包含Config Server和Config Client两部分,Server提供配置文件存储,对外提供接口以获取配置文件的内容,Client通过接口获取数据,并初始化自己。

https://zhuanlan.zhihu.com/p/65654453

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。https://www.jianshu.com/p/8b26f8729bf4

 

(1)config服务器端

第一步:新建config服务器工程,引入config服务器架包

 

第二步:新增配置,配置存放配置文件的github路径

 

第三步:启动类新增config服务端配置信息

(2)config客户端

第一步:新增config客户端工程,新增config客户端架包

 

第二步:新增配置

默认生成规则,工程名-profile,上面就是micro-weather-config-client-dev

 

在github上就是这个

 

8 一些思考

第一个问题:一台服务器的并发量有多少,由什么决定?

 因素一:服务器网络带宽

 因素二:服务器系统内存(注意是内存不是硬盘哦)

 因素三:web容器

 因素四:程序代码

 

服务器网络带宽

       假如你的服务器带宽是5M,如果你的http求头是8k,那么你的服务器最大并发数是 5M/8k =640

操作系统内存

        假如你的操作系统内存是8G,如果你的每个请求占用内存256K,那么你的服务器最大支持并发数就是8G/256K=32758。这就是为啥购买服务器,内存越大,配置越高 支持的并发数越大的原因(当然money越多)。

web容器

       web容器的选择和配置也是至关重要的,比如说tomcat 的 baseio 和nio的区别就很大,tomcat配置一般启用的是线程池,maxThreads 一般配置为操作系统支持的最大并发数

程序代码

        程序代码放到第四才介绍,可见他的重要性,做了这么多年的程序猿,以前要是想提高并发,我总是抓破头皮的想如何提高代码质量,其实他别不那么重要(也许这样说你会感到很沮丧),更直接的且有效的方式就是提高服务器的配置即。但是,代码质量也是起着不可小觑的作用的,通常在所有的硬件条件都确定的情况下,入门级测试并发工具是 loaderrunner,我们通常挑选系统常用且耗资源的请求来测试,即可得到我们软件的并发量了。

        纠错:查询一些资料,介绍说系统并发数是65535,这个认识是不正确的。65535是2的16次方的值。操作系统的端口是用一个16位的二进制表示,因此65535代表的是操作系统的端口数,0-1023端口属于保留端口,不对外开放使用。

 小知识:

    FTP 默认端口       21

    HTTP默认端口      80

    SMTP默认端口      25

    TCP默认端口       22

    Telnet默认端口       23


第二个问题:自动扩展的是监控吗,如何监控服务器是否会爆掉?

 

以上是关于学习springcloud的一些心得体会——老卫的天气预报系统的主要内容,如果未能解决你的问题,请参考以下文章

Netty 实现聊天功能

SpringCloud学习心得

SpringCloud学习心得—1.3—Eureka与REST API

springboot,JPA与elasticsearch整合测试用例

SpringCloud学习心得—1.2—Eureka注册中心的密码认证高可用的设置

springcloud 学习