快速理解Spring Cloud

569 阅读4分钟

    本文主要介绍了Spring Cloud的几大组件,包括SpringBoot, 配置中心服务注册中心服务网关服务调用

一、SpringBoot

    SpringBoot官方页面给出的其特性。主要就是提供了内嵌的Web容器,自动配置spring和一些第三方的jar包,不需要xml的配置,还有就是提供一些监控数据。
    对于熟悉Spring MVC开发体系的开发者来说,和以前相比,其实就是少了xml的配置,包括web.xml以及spring context的一些配置(Servlet 3规范中就已经指出web程序中可以不包含web.xml了)。
    把以前的项目转换成spring boot也比较简单,实际上就是使用注解来代替xml文件配置。 比如以前使用了Mybatis +Spring MVC,现在要转换成spring boot,实际上只需要生成SqlSessionFactory, DataSource 对应的Bean,再配置好扫描的package路径,其余将以前照搬过来就行。

主要涉及到@Configuration @Bean这两个注解

面这段代码有个问题是需要将basepackage写死在代码里,很不友好,因为这个Bean初始化的时候,spring还没有加载配置文件,导致无法从将basepackage写在配置文件里面,正确操作方式是使用@MapperScanner注解。 当然实际上,其实并不需要这么复杂,这种通用操作,早有人封装好了,直接引用其依赖即可。这里只是为了展示将xml转换为java代码的思路。

有兴趣的可以开下它的源代码,整体思路与上面给出的代码类似,只是他使用了spring boot的auto configuration,代码里面有@Conditional开头的注解。另外就是 @ConfigurationProperties、 @EnableConfigurationProperties .这两个注解可能经常用到,将配置文件中的配置映射为对象。 注册Filter和Listener。涉及到以下两个类:FilterRegistrationBean 、 ServletListenerRegistrationBean

二、配置中心(sring cloud config)

    在分布式环境下,如果每个实例保存一份配置文件,当有配置项发生变化的时候,需要每个实例都修改配置,比较麻烦。所以就衍生出了配置中心。将所有的配置文件在配置中心集中存放,各个应用从配置中心拉取配置,然后启动相关应用。
    比较常用的方式,使用git等版本管理工具作为配置中心和使用zookeeper作为配置中心(spring cloud zookeeper)。使用zookeeper时可以将节点信息的变动通知到服务,可以不重启服务而修改到配置,其他方式没有使用过,不知道能不能做到。

三、服务注册中心(Eureka)

    微服务模式下,一个大的Web应用通常都被拆分为很多比较小的web应用(服务),这个时候就需要有一个地方保存这些服务的相关信息,才能让各个小的应用能够知道需要调用的应用的具体信息在那里,即注册中心。
    每个应用启动时向配置的注册中心注册自己的信息(ip,context, 服务名称等信息),注册中心将他们保存起来,服务间相互调用的时候,通过服务名称到注册中心来找到对应的服务的地址。
    Spring cloud官方采用Eureka来作为服务注册发现的组件(新版本据说不开源了),如果需要完全可以采用zookeeper以及其他组件来做注册中心,只要实现相关逻辑即可。

注册中心(Server端)

客户端(Client)

    启动类上加注解 @EnableEurekaClient 配置文件中加上注册中心(Server)的信息

四、服务网关(Zuul)

    网关这个东西一开始,我其实没搞懂到底是个啥,感觉很高大上,后面想了一下,其实很简单,可以理解为其实也就是个服务,只是所有的请求都经过这里,由他来做请求的路由、分发。比如大家熟悉的nginx,或者说就是自己开发的web应用,本身也就是个网关(只是他把请求分发到自己而已)
    使用方式也比较简单 启动类注解@EnableZuulProxy 配置文件配置具体路由策略

则访问http://zuul-server/demo-eureka-client/则会将请求转发到http://demo-eureka-client
    当然实际场景可能没有这么简单,因为本身网关还有很多用途,比如负载均衡,权限控制,限流等等。

五、服务调用(Feign)

    这个其实比较简单,就是封装了http请求的发送, 可以让我们不再自己使用httpclient来编写代码

比如上面这段代码,调用该方法的时候就可以访问到demo-eureka-client服务中的/user/getUser接口,传入参数为userId,并将返回值封装为Result对象。

代码有些看不清楚,详细信息可以查看:gitee.com/_chenxiaoyu…

参考
spring boot 官网
spring cloud官网