对SpringCloud微服务架构的理解

2019-07-31  本文已影响0人  格雷福豪

微服务

微服务 将all in one的项目拆分,可以按业务拆分成独立的模块等,降低模块与模块之间的耦合性,每个微服务还能有自己独立的数据库。每个微服务在自己独立的进程中运行,不会互相干扰。异构。支持不同语言、不同类型的数据库

集群:一组集成的计算机软件连接起来

分布式:一组计算机通过网络通信协调它们之间的行为。组件之间交互来实现一个共同的目标。

集群和分布式不冲突。分布式的某个需要扩展的模块可以使用集群。

CAP:强一致性C、极致可用性A、分区容错性P。这三个不能同时满足。

微服务的特点:

不适合微服务的:

服务拆分的方法:

微服务架构

这是一种新型、轻量的架构,利用REST API来保持微服务之间的通信。与dubbo不同的是,dubbo用的是rpc通信。

维度:开发、配置与管理、消息队列、服务接口调用、治理、注册与发现、负载均衡、监控。。。。

SpringCloud微服务架构:

image.png

这里面的常用组件:

Spring Cloud网关 (Zuul/GateWay)

应用场景:统一外部入口、请求路由、认证授权、请求限流、请求日志和监控

SpringCloud Zuul功能:①服务路由,②自定义过滤器,需要继承ZuulFilter并重写方法。下面的Autorizefilter模拟身份验证功能,它继承了ZuulFilter抽象类,重写了filterType filterOrder shouldFilter run方法

@Component
public class Authorizefilter extends ZuulFilter {
    private static final Logger logger = LoggerFactory.getLogger(Authorizefilter.class);
    private static String access_token;

    public Authorizefilter(){
        access_token = UUID.randomUUID().toString();
        logger.info(access_token+"-==========----------");
    }
    /**
     * 外部请求-> zuul-(pre) ->选择路由的服务-(routing) ->请求服务-(post) ->zuul
     * pre:在请求路由之前执行
     * routing:在请求路由之后执行
     * post:在请求路由到服务之后执行
     * error:在其他阶段发生错误的时候执行
     * @return 过滤器的类型是什么
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     *
     * @return 过滤器执行的顺序
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     *
     * @return 是否执行过滤器
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 具体逻辑
     * @return Some arbitrary artifact may be returned. Current implementation ignores it.
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        String access_token = request.getParameter("access_token");
//        模拟授权
        if (Objects.equals(access_token,Authorizefilter.access_token)){
            requestContext.setResponseStatusCode(HttpStatus.OK.value());
            requestContext.setResponseBody("Authorize");
            requestContext.setSendZuulResponse(false);
        }else {
            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
            requestContext.setResponseBody(HttpStatus.UNAUTHORIZED.getReasonPhrase());
            requestContext.setSendZuulResponse(false);
        }
        return null;
    }
}

Spring Cloud GateWay出现是由于Zuul 在2版本后不维护了,它是zuul的扩展。

SpringCloud服务治理 (Eureka/Consul)

Eureka:保证了高可用性A

Consul:保证强一致性C

对Eureka Server端的application使用@EnableEurekaServer注解表示加载EurekaServer的配置;

在客户端Client,对application使用@EnableDiscoveryClient注解表示加载EnableDiscoveryClientImportSelector的配置,用于被Service发现

服务发现的两种方式:客户端发现(Eureka),服务器发现(Nginx、Zookeeper、Kubernetes)

SpringCloud服务调用(Feign)

Feign 采用了基于注解的接口,是声明式REST客户端(虽然在他的接口中看不到http请求)

SpringCloud 配置中心(Config)

为啥使用配置中心?

当把配置文件都放在项目包下,不方便之后的维护;需要测试时,对配置文件修改之后,不方便另外的人员维护;配置内容中数据库的账号密码不能随意暴露给开发者;更新配置项目需要重启。

统一配置中心?

如何配置?

配置服务中心可以看作: 远端git仓库——配置中心服务端——配置客户端

在远端git仓库中,最好是将一个服务共有的配置提取出来为 如client.yml,再将不同配置放入如client-dev.yml等中。为什么要这样做?因为配置客户端会将远端的带client命名的所有yml拉下来并且合并起来,所以如果两个配置文件一样,你只改了其中一个文件是等于无效的。

SpringCloud配置中心配置同步

当我们在远端git仓库上修改了配置文件之后,其实我们的配置服务端并没有做出响应,那么也就没有说把新的配置文件传给下面的配置客户端,我们只能通过重启配置服务器来同步。但是这样做显得过于不便,现在可以使用Bus这个组件来实现配置中心配置同步。

image.png
上一篇 下一篇

猜你喜欢

热点阅读