美文网首页
爱思乐社交架构介绍(微服务架构方面)

爱思乐社交架构介绍(微服务架构方面)

作者: 久伴_不离 | 来源:发表于2019-05-28 11:01 被阅读0次

关于架构介绍几乎是每次面试必说的知识点,在介绍时主要从以下方面去介绍:

架构基本介绍

1. 公司整体开发思路:

我们公司整体采用前后端分离的模式开发,

2. 前端网站开发思路

前端主要以vue框架为核心,整合了vueRoute、ElementsUI、Axios、使用ES6语言规范开发,还使用到了Node、Npm、Nuxt等前端框架

3. 后台微服务开发思路

后台采用微服务架构提供服务,微服务架构我们主要采用Spring全家桶,比如微服务的开发 主要使用 SpringBoot快速构建,使用SpringMvc实现web应用, 使用SpringDataJpa实现数据查询,另外还大量使用了SpringData的其他组件,比如说:SpringDataRedis,SpringDataMongo,SpringDataElasticSearch,SpringDataRabbit 等,关于微服务管理使用SpringCloud 如:Eureka实现注册中心,服务间的通信采用Feign,配置中心使用Config,使用 Zuul 提供对外提供网关,使用hystrix提供服务间的断路保护,前后台的数据通信采用restful, 并且项目中选用的jdk版本为1.8 项目中也大量的使用到了1.8的新特性

4. 运维部署方面

使用docker 做容器的管理,使用jenkins做持续集成

5. 升级版架构

服务注册中心 及 配置中心 采用了nacos 相对于 Spring Cloud Eureka 来说,Nacos 更强大。

在流量实时监控上,选用了 alibaba 的 Sentinel ,来为运维提供实时监测流量,以便流量高峰到来时能够进行

流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

详细说明:https://www.cnbeta.com/articles/tech/753481.htm

微服务管理 采用Spring boot Admin 进行微服务的健康监控

详细说明: https://www.cnblogs.com/zhangjianbin/p/6346553.html

环境相关

开发工具: idea2018 依赖插件: lombok mybatisX

依赖环境:

JDK: 1.8

Maven: 3.3+

MySql: 5.7+

Redis: 4.0+

Nacos: 1.0.0

Sentinel: 1.5.0+

Node Js: 10.15.0+

Npm: 5.6.0+

应用软件:

后台技术:SpringBoot(2.1.4) SpringData SpringCloud(G版本) (持久层可以说jpa 或者 mybatisPlus) ElasticSearch RabbitMQ 阿里云OSS 阿里云短信

前台技术:Vue VueRoute、Vuex、axios、ElementUI、ES6

详细知识点介绍

前端简单介绍

Node前端项目开发时运行环境 (生产环境部署到nginx下执行)

NPM 作为包管理工具 (管理JS)

ES6 (EcmaScript => 前端js的规范,就像后台的jdk版本一样 let const import export =>箭头函数 )

vue: 当前最流行三大框架之一(vuejs angularjs reactjs), 尤雨溪开发的 渐进式 双向数据绑定的框架 ,可以让我们从繁琐的dom操作中脱离出来,只关注数据的变化, 而且组件化开发的模式,让我们对常用功能的复用更加方便,后台管理页面构建起来也更加简单(比如:举个增删改查的栗子, 搜索表单组件 表格组件 分页组件 弹窗组件 引入进来即可有效果,我们只关注数据的获取),常用指令 v-for v-model v-if v-show v-bind @click 取值表达式:{{}}

ElementUI ui框架

Axios 类似ajax 用于和后台通信

nuxt vue单页应用对SEO不友好,所以当写前台网站时可以引入nuxt插件,进行服务器渲染。

前后台数据交互的介绍

我们前后台是统一按照restful风格的规范来设计接口文档,使用swagger来生成文档,后台会根据这套文档提供相对应的web接口,前台网站会根据接口文档使用axios组件进行调用, 大部分的参数格式 主要是路径传参、JSON传参

后台主要采用 @PathVariable @RequestBody传参

微服务间数据是如何通信

我们微服务的通信,主要使用的是 SpringCloud里面的 feign组件,它可以帮我们进行微服务的调用,并且它提供了Ribbon的负载均衡功能,并且还集成Hystrix (断路器)。

下面具体使用:我们在写微服务的时候,除了创建 微服务的工程之外, 还创建了一个这个微服务所对应的Api工程, 在这个API工程中,我定义了 微服务对外提供服务的接口, 这个接口标注了 @FeignClients注解, 如果其他的服务要调用我们的这个服务, 就直接可以引入API工程,即可调用我们的服务,并且在API工程中我们还提供了 实体类 和 VO视图实体 便于操作

鉴权操作

我们提供的web接口 采用的是JWT的token认证方式 ,

我们后台的每个微服务工程,都有token的拦截器, 拦截器会判断,用户所访问的路径是否是需要认证的,如果是需要认证的,那么我们需要在request中的header中 取到对应 token (Bearer 21321432ewrewr.1231431.314134) 会进行对应的解析,

我们的token是使用jwt( json web token )的格式 ( 头信息 , 载荷信息 , 签名 ) , 如果token没有、失效、格式不对、被串改都会抛出对应的异常。 前端得到这个异常之后 ,代表现在没有登录成功,可以专门去 认证服务中心 (auth-service) 进行认证的请求,输入用户名 密码 进行登录操作, 如果登录操作成功 认证中心 会 创建一个JWT的token 返回给前端用户,接下来前端用户 就可以 使用该token 作为一个凭证。

如何使用: 添加 没有删除

权限管理: 用户表 角色表 权限表 用户角色表 角色权限表

用户添加 权限值:A005

鉴权中心: 在颁发token的方法中 , 需要 查询出 该登录用户的 角色, 及可以访问所有功能权限的集合 (set集合) 将该用户权限存入 redis中 quanxian_用户ID set集合

在每一个需要鉴权的方法中 加上 @Permisstion("('A005')") 才能访问此方法,AOP 中 使用该注解作为切入点,然后使用环绕通知 , 来获取注解上的权限值 将 该登录用户的ID 去 redis中, 把他能够访问的所有权限查看包含不包含,如果不包含说明权限不足 抛出权限异常

数据安全

后台用户密码 MD5 加 盐 (因为MD5加密比较常用,所有呢有人利用彩虹表的方式会尝试破解 ,所以我们在md5的基础上进行了加盐的方式加密, 使用用户名作为加盐混淆字符串 )敏感数据采用AES 加 Base64前台 和 后台都要维护一个 密钥字符串 , 前台在传递参数的时候 , 将参数 使用AES的算法以定义好的密钥进行加密 ,加密后进行 Base64的编码操作。

后台接收到数据之后, 先进行 Base64解码操作 得到密文, 在使用AES算法 + 密钥 进行解密操作,得到原本的参数

内置了Xss 过滤 , 防止跨站脚本攻击

内置XSS过滤器

从写法上 也避免了Sql注入

日志的处理

系统的错误日志信息,采用全局异常处理的配置方案,并且捕获到异常后 ,采用消息队列解耦 在消息的消费端统一存入日志数据库

全局异常配置: @RestControllerAdvice + @ExceptionHandler

使用rabbitMQ 异步存储日志 数据库中

12点Exception某某用户  调用  某某方法产生的

web接口操作日志: 自定义@WebLog 定义@WebLogAspect 在切面中 进行一个 web操作日志处理

                          某某用户    在  什么时候  访问IP多少  方法是什么    做了什么操作

跨域的配置

使用跨域注解 @CrossOrgin

jsonp

前端proxy 代理的方式

部署方案

运维采用的是自动化持续部署,本身我们各种容器的管理都是采用docker , 在我们的maven项目中也整合了docker maven plugin插件,新写的代码如果要发布到服务器可以直接使用这个插件构建docker镜像并推送到本地docker仓库

(mvn clean package docker:build -DpushImage)。这里我们引用了jenkins实现了持续集成,jenkins里面内置了git插件和maven插件,它可以自己连接到git仓库使用maven的命令来帮我们部署代码。docker容器我们也采用rancher进行管理。

你们后台返回给前台数据的格式是什么样的

{

"status":"",

"msg":"",

"data":"",

"success":boolean

}

OK = 20000; //成功

ERROR = 20001; //服务器出错

LOGIN_ERROR = 20002; // 登录失败

ACCESS_ERROR = 20003; // 权限不足

REMOTE_ERROR = 20004; // 远程调用失败

REP_ERROR = 20005; // 重复调用

为什么选用nacos作为服务的注册发现中心

服务注册中心 及 配置中心 采用了nacos 相对于 Spring Cloud Eureka 来说,Nacos 更强大。

Nacos = Spring Cloud Eureka + Spring Cloud Config

Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。

相关文章

网友评论

      本文标题:爱思乐社交架构介绍(微服务架构方面)

      本文链接:https://www.haomeiwen.com/subject/quyrtctx.html