一些收藏

4. 秒杀购物商城基础服务-用户中心

2022-03-15  本文已影响0人  洛神灬殇

基础服务-用户中心

什么是用户中心?

用户中心,在我们的概念里面范围比较的广泛,包含了用户信息、账号信息以及租户信息的管理控制,在我们的总体设计里面,如果设计的边界较为紧密,也可以将权限的部分功能RBAC划分进入,当业务剧增的时候,可以将领域划分细一些。

用户中心功能范围

image

以上服务中心可与i独立部署,也可以采用巨石部署方式,但是领域划分原则不会因此改变。

用户服务中心

主要面向相关的用户服务信息

image

账户服务中心

主要面向与相关的账户服务中i性能

image

租户服务中心

主要面向与相关的租户概念中i相关,包含:租户隔离机制以及租户控制

image
Dubbo3的RPC技术调用体系

本章我们计划采用Dubbo3的rpc服务调用体系,进行将网关中心和权限安全中心对接我们的用户中心,使得我们的网关中心 -> 安全中心 -> 用户中心

image

我们采用安全中心作为鉴权处理、用户中心进行信息维护和控制,网关中心作为路由服务以及过滤控制审计等。

本章用户中心所设计技术内容

image

Dubbo3的Annotation配置方式进行相关的使用案例

服务端的配置控制

首先,我们先进行编写一个服务提供者的配置信息类

@Configuration
@EnableDubbo(scanBasePackages = "xx.xx.xx")
@PropertySource("classpath:/spring/dubbo-provider.properties")
static class ProviderConfiguration {
}

@EnableDubbo 注解将会启用 Spring xx.xx.xx 包 搜索遍历寻找相关的Dubbo注解的所有相关的类

定义一个服务提供者的接口

作为服务提供者的实现接口,将会有一个被@DubboService:进行修饰的接口实现类

@DubboService
public class AnnotatedGreetingService implements GreetingService {
    public String sayHello(String name) {
        System.out.println("greeting service received: " + name);
        return "hello, " + name;
    }

}
消费端的配置控制

首先,我们先进行编写一个服务消费端的配置信息类

@Configuration
@EnableDubbo(scanBasePackages = "xx.xx.xx")
@PropertySource("classpath:/spring/dubbo-consumer.properties")
@ComponentScan(value = {"org.apache.dubbo.samples.annotation.action"})
static class ConsumerConfiguration {
}

之后需要采用 @DubboReference 注解进行修饰对应接口,进行注入相关的远程服务的实现类:

@Component("annotatedConsumer")
public class GreetingServiceConsumer {

    @DubboReference
    private GreetingService greetingService;
    ...
}

实现开发用户登录功能开发实现以及接口设计·

主要面向与用户执行登录的操作控制接口实现机制,通过输入用户信息凭证,使用用户名+密码执行登录操作

实现用户注册、注销功能开发实现以及接口定义

获取用户登录信息以及忘记密码实现以及接口定义

更新用户个人信息以及接口定义和功能实现

完成相关的重置密码的接口定义及功能实现

通过MybatisPlus实现多租户操作实现机制,实现数据的租户隔离机制

主要采用MybatisPlus框架自带的拦截器机制,在拦截时直接进入注入相关的tenant_id数据值:

多租户的使用
public interface TenantLineHandler {

    /**
     * 获取租户 ID 值表达式,只支持单个 ID 值
     * <p>
     *
     * @return 租户 ID 值表达式
     */
    Expression getTenantId();

    /**
     * 获取租户字段名
     * <p>
     * 默认字段名叫: tenant_id
     *
     * @return 租户字段名
     */
    default String getTenantIdColumn() {
        return "tenant_id";
    }

    /**
     * 根据表名判断是否忽略拼接多租户条件
     * <p>
     * 默认都要进行解析并拼接多租户条件
     *
     * @param tableName 表名
     * @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件
     */
    default boolean ignoreTable(String tableName) {
        return false;
    }
}

说明:

多租户 != 权限过滤,不要乱用,租户之间是完全隔离的!!! 启用多租户后所有执行的method的sql都会进行处理. 自写的sql请按规范书写(sql涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join)

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    // 如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
    // 用了分页插件必须设置 MybatisConfiguration#useDeprecatedExecutor = false
    //        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());

    interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(
        new TenantLineHandler() {
            // manager_id = 1088248166370832385

            // 获取租户 ID 值表达式,只支持单个 ID 值
            @Override
            public Expression getTenantId() {
                return new LongValue(1088248166370832385L);
            }
            // 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件,
            // 这里设置 role表不需要该条件
            @Override
            public boolean ignoreTable(String tableName) {
                if ("role".equals(tableName)) {
                    return true;
                }
                return false;
            }

            @Override
            public String getTenantIdColumn() {
                return "manager_id";
            }
        }));
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
}

@Bean
public ConfigurationCustomizer configurationCustomizer() {
    return configuration -> configuration.setUseDeprecatedExecutor(false);
}

介绍相关Triple通信协议的介绍和实现

RPC 协议的选择

协议是 RPC 的核心,它规范了数据在网络中的传输内容和格式。除必须的请求、响应数据外,通常还会包含额外控制数据,如单次请求的序列化方式、超时时间、压缩方式和鉴权信息等。

协议的内容包含三部分
Dubbo3的通信协议
Triple 协议

服务流量管理

通过 Dubbo 定义的路由规则,实现对流量分布的控制

流量管理

流量管理的本质是将请求根据制定好的路由规则分发到应用服务上,如下图所示:

image
其中:
Dubbo流量管理介绍

Dubbo提供了支持mesh方式的流量管理策略,可以很容易实现 A/B测试、金丝雀发布、蓝绿发布等能力。

Dubbo将整个流量管理分成VirtualService和DestinationRule两部分。当Consumer接收到一个请求时,会根据VirtualService中定义的DubboRoute和DubboRouteDetail匹配到对应的DubboDestination中的subnet,最后根据DestinationRule中配置的subnet信息中的labels找到对应需要具体路由的Provider集群。其中:

兼容 gRPC ,以 HTTP2 作为传输层构建新的协议,也就是 Triple。

容器化应用程序和微服务的兴起促进了针对负载内容优化技术的发展。 客户端中使用的传统通信协议( RESTFUL或其他基于 HTTP 的自定义协议)难以满足应用在性能、可维护性、扩展性、安全性等方便的需求。一个跨语言、模块化的协议会逐渐成为新的应用开发协议标准。自从 2017 年 gRPC 协议成为 CNCF 的项目后,包括 k8s、etcd 等越来越多的基础设施和业务都开始使用 gRPC 的生态,作为云原生的微服务化框架, Dubbo 的新协议也完美兼容了 gRPC。并且,对于 gRPC 协议中一些不完善的部分, Triple 也将进行增强和补充。

上一篇 下一篇

猜你喜欢

热点阅读