当前位置: 首页 > news >正文

长春火车站出入最新规定企业咨询管理有限公司干嘛的

长春火车站出入最新规定,企业咨询管理有限公司干嘛的,互联网保险发展趋势,长春阿凡达网站建设文章目录一 数据库访问接口1 MyBatis2 Spring Data JPA3 Spring Data MongoDB二 数据库1 MySQL2 MongoDB3 Redis三 开发规范化、响应格式与异常处理1 开发规范2 响应格式3 异常处理四 RabbitMQ五 Spring Cloud 相关工具1 Eureka2 Ribbon3 Feign4 Zuul 网关六 搜索服务1 Elastic… 文章目录一 数据库访问接口1 MyBatis2 Spring Data JPA3 Spring Data MongoDB二 数据库1 MySQL2 MongoDB3 Redis三 开发规范化、响应格式与异常处理1 开发规范2 响应格式3 异常处理四 RabbitMQ五 Spring Cloud 相关工具1 Eureka2 Ribbon3 Feign4 Zuul 网关六 搜索服务1 ElasticSearch2 Logstash七 用户认证与授权1 Spring Security OAuth22 JWTJson Web Token3 单点登录和身份校验4 用户授权 RBACRole-Based Access Control一 数据库访问接口 1 MyBatis 用于写相对复杂多表连接的 SQL 命令使用时用 Mapper 注释 xxMapper 接口在接口中定义方法并创建同名的 xxMapper.xml 文件在方法对应的标签存放 SQL 命令更多关于 MyBatis 2 Spring Data JPA Spring 提供的操作 MySQL 单张数据表的 API无需自行编写 SQL接口一般命名为 xxRepository public interface TeachplanRepository extends JpaRepositoryTeachplan, String {/*** 根据课程id 和 parent id 查询课程计划*/ListTeachplan findByCourseidAndParentid(String courseId, String parentId); }需要对数据表对应的类加一系列注解不止如下所示 3 Spring Data MongoDB 使用方法类似于 Spring Data JPA需要通过对类的注释实现模型-表的映射 // 数据表对应的类 Document(collection filesystem) public class FileSystem {// 省略表的一系列属性... }// dao public interface FileSystemRepository extends MongoRepositoryFileSystem, String { }二 数据库 1 MySQL InnoDB 存储引擎 索引结构是B树和B树相比查询效率更稳定I/O次数少对范围查找的支持更好 实现了行级锁 支持外键一些优化措施 查询操作时只返回需要的行或列 尽量不在数据表中存储 NULL不在 SQL 命令的条件中判断 NULL 字段的数据类型定义准确 设计数据表时遵循范式规则 1/2/3NF 对数据表进行适当的行、列拆分索引分类 主索引/二级索引 聚簇索引/非聚簇索引…如果没有主键也没有合适的唯一索引那么 InnoDB 内部会生成一个隐藏的主键作为聚集索引这个隐藏的主键是一个6个字节的列该列的值会随着数据的插入自增 2 MongoDB NoSQL 的一种以类 Json 的文档格式存储数据文档型数据库本项目中负责存放一系列的页面信息索引结构是B树不具有 MySQL 的完善的事务特性在本项目中用于存储非核心数据 3 Redis NoSQL 的一种一般作为缓存数据库辅助持久化的数据库本项目中负责存放登录用户的 (access_token, JWT refresh_token) 的键值对拥有两种持久化机制RDB 和 AOF其特性查阅链接项目中使用 StringRedisTemplate 操作 Redis更多关于 Redis 三 开发规范化、响应格式与异常处理 1 开发规范 get 请求时采用 key/value 格式请求SpringMVC 可采用基本类型的变量接收也可以采用对象接收post 请求时可以提交 form 表单数据application/x-www-form-urlencoded和 Json 数据application/json文件等多部件类型multipart/formdata三种数据格式SpringMVC 接收 Json 数据Controller 主要作为响应 URL 的接口粘合剂的作用业务逻辑实现放在 Service 层DAO 仅仅负责与数据库交互而不考虑任何业务逻辑 2 响应格式 设置枚举类型的响应代码 public enum CommonCode implements ResultCode {SUCCESS(true,10000,操作成功),FAIL(false,11111,操作失败),UNAUTHENTICATED(false,10001,此操作需要登陆系统),UNAUTHORISE(false,10002,权限不足无权操作),SERVER_ERROR(false,99999,抱歉系统繁忙请稍后重试),INVALIDPARAM(false, 10003, 参数非法);// ... }针对不同的客户端请求返回对应的一致的类型查询返回 QueryResponseResult添加返回 ResponseResult … 3 异常处理 设置枚举类型的异常代码写入异常编号和异常信息使用统一的类抛出使用静态方法包装和捕获异常使用 SpringMVC 提供的 ControllerAdvice 注解类 和 ExceptrionHandler 注解方法自定义异常类型继承自 RuntimeException属于 unchecked 异常不捕获仍然可以运行实际交给增强控制器完成捕获 // 异常抛出使用静态方法包装 public class ExceptionCast {public static void cast(ResultCode resultCode) {throw new CustomException(resultCode);} }// 异常捕获使用Spring提供的 ControllerAdvice注解类 和 ExceptrionHandler注解方法 ControllerAdvice public class ExceptionCatch {private static final Logger LOGGER LoggerFactory.getLogger(CustomException.class);private static ImmutableMapClass? extends Throwable, ResultCode EXCEPTIONS;//使用builder来构建一个异常类型和错误代码的异常protected static ImmutableMap.BuilderClass? extends Throwable,ResultCode builder ImmutableMap.builder();static{// 加入一些基础的异常类型判断...builder.put(HttpMessageNotReadableException.class, CommonCode.INVALIDPARAM);}// 处理自定义异常形参为捕获异常类型ExceptionHandlerResponseBodypublic ResponseResult customException(CustomException customException) {ExceptionCatch.LOGGER.error(捕获到自定义异常);ResultCode resultCode customException.getResultCode();return new ResponseResult(resultCode);}// 处理不可预料异常ExceptionHandlerResponseBodypublic ResponseResult exception(Exception e) {if (ExceptionCatch.EXCEPTIONS null) {EXCEPTIONS ExceptionCatch.builder.build(); // 构建map}ResultCode resultCode ExceptionCatch.EXCEPTIONS.get(e.getClass());if (resultCode ! null) {// map中有该异常类型return new ResponseResult(resultCode);} else {// 没有返回99999return new ResponseResult(CommonCode.SERVER_ERROR);}} }四 RabbitMQ 项目中简单用到了 routing 模式生产者发送消息时需要指定 routing key交换机会根据 routing key 将消息投递到指定的队列使用消息队列的主要优点解耦、异步、削峰因为 MQ 短时间积压数据是可以接受的RabbitMQ 结构 五 Spring Cloud 相关工具 1 Eureka 注册中心 微服务数量众多要进行远程调用就需要知道服务端的 IP 地址和端口注册中心帮助管理这些服务的 IP 和端口 注册的微服务会向注册中心实时上报自己的状态注册中心统一管理这些微服务的状态 将存在问题的服务踢出服务列表客户端获取可用的服务进行调用注册中心同样属于一个微服务它的启动类要加上注解 EnableEurekaServer对于要向注册中心注册的微服务需要在启动类加注解 EnableDiscoveryClient表示它是一个 Eureka 的客户端用于发现其它微服务高可用 Eureka 需要两个注册中心相互注册即使其中一台停机也不会影响服务的注册和发现启动后访问指定端口就可以便捷地检测微服务情况本项目为 50101 和 50102 2 Ribbon 执行客户端的负载均衡而非 Nginx 这种服务端的负载均衡Ribbon 先从 EurekaServer 中获取服务列表根据负载均衡的算法去调用微服务Spring Cloud 引入 Ribbon 配合 RestTemplate 本项目使用 okhttp 进行远程调用实现客户端负载均衡RestTemplate 是 Spring 提供的一个访问 HTTP 服务的客户端类微服务之间的调用需要使用 RestTemplate使用方法 1、添加相关依赖并配置 2、创建 resttemplate 的 bean使用 LoadBalanced 注解 3、服务名代替 IP 地址端口号发挥注册中心的作用不用手动写入 IP 地址端口号 而交给注册中心管理后面拼接相应 Controller 方法路径 3 Feign 可以实现 像调用本地接口一样调用远程接口 这个远程接口指的是在注册中心注册过的某个微服务提供的 Controller 方法内部集成了 Ribbon可以实现客户端负载均衡使用方法 使用EnableFeignClients 注解启动类Spring 会扫描标记了 FeignClient 注解的接口生成代理对象 使用 FeignClient 注解客户端接口并指定该接口绑定的微服务名指定后 Feign 会从注册中心获取服务列表并通过负载均衡算法进行服务调用 如果接口的方法返回类型为对象则该类型必须有无参构造器 Feign 根据接口方法的注解的 URL进行远程调用 FeignClient(name XC-SERVICE-MANAGE-CMS) // 指定该接口绑定的微服务名 public interface CmsPageClient {GetMapping(/cms/page/get/{id})CmsPage findById(PathVariable(id) String id); }4 Zuul 网关 网关在微服务前边设置一道屏障请求先到服务网关网关会对请求进行过滤、校验、路由等处理。有了服务网关可以提高微服务的安全性网关校验请求的合法性请求不合法将被拦截拒绝访问用网关的好处是无论调用哪个微服务客户端所有的请求都访问网关的 IP 地址和端口号由网关使用 Eureka 负责将请求路由到指定的微服务因为 Zuul 的配置了 Eureka 中各种微服务的 ID zuul:routes:manage‐course: #路由名称名称任意保持所有路由名称唯一path: /course/**serviceId: xc‐service‐manage‐course # 从Eureka中找到服务的ip和端口# url: http://localhost:31200 # 也可转发到指定urlstrip‐prefix: false #true代理转发时去掉前缀sensitiveHeaders: # 默认zuul会屏蔽cookie不会传到下游服务设置为空则取消屏蔽如果设置了具体的头信息则不会传到下游服务# ignoredHeaders: Authorization # 可以设置过滤的头信息默认为空表示不过滤任何头jwt要放在header中所以要关闭该功能六 搜索服务 1 ElasticSearch 在项目中实现课程搜索的功能应用流程 1、用户在前端搜索关键字前端通过 HTTP 方式请求项目服务端 2、项目服务端通过 RESTful 方式请求 ES 集群进行搜索需要手动构建 HTTP Request 3、ES 集群从索引库检索数据并返回另外用到了 ES 的可视化插件 Head 和 IK 分词器中文分词6.0之前的版本有 type类型概念type 相当于关系数据库的表但 ES 官方建议索引库只存放相同类型的文档即用关系数据库的表概念类比ES的索引库。项目中将 type 指定为 doc只是无意义的占位符可以使用 Postman 发送各种类型的 HTTP Request 操作 ES项目中需要在配置类生成 RestClient 的 Bean用来操作 ES Configuration public class ElasticsearchConfig {Value(${dino.elasticsearch.hostlist})private String hostlist;Beanpublic RestHighLevelClient restHighLevelClient(){//解析hostlist配置信息String[] split hostlist.split(,);//创建HttpHost数组其中存放es主机和端口的配置信息HttpHost[] httpHostArray new HttpHost[split.length];for(int i0;isplit.length;i){String item split[i];httpHostArray[i] new HttpHost(item.split(:)[0], Integer.parseInt(item.split(:)[1]), http);}//创建RestHighLevelClient客户端return new RestHighLevelClient(RestClient.builder(httpHostArray));}}2 Logstash Logstash 的功能是将 MySQL 的数据表同步到索引库配置并启动 Logstash如果 document 的时间戳大于上次采集的时间就更新索引库项目中为了便于搜索服务的开发将课程的一系列信息汇总为一张数据表将该表同步到索引库并使用 JPA 操作数据表因为课程服务是从 ES 的索引库而非数据库搜索所以 Service 层没有自动注入 DAO 七 用户认证与授权 1 Spring Security OAuth2 常用的有授权码模式主要用于第三方登录和密码模式。项目采用密码模式授权码模式流程 1、客户端请求第三方授权 GET localhost:40400/auth/oauth/authorize?client_idXcWebAppresponse_typecodescopappredirect_urihttp://localhost - client_id客户端 id和授权配置类中设置的客户端 id 一致 - response_type授权码模式固定为 code - scop客户端范围和授权配置类中设置的 scop 一致 - redirect_uri跳转 uri当授权码申请成功后会跳转到此地址并在后边带上 code参数授权码2、用户(资源拥有者)同意给客户端授权3、客户端获取到授权码 7bjwZ5请求认证服务器申请令牌 POST http://localhost:40400/auth/oauth/token需要在请求体中添加 - grant_type授权类型填写 authorization_code表示授权码模式 - code授权码就是刚刚获取的授权码授权码只使用一次就无效了需要重新申请 - redirect_uri申请授权码时的跳转 url和申请授权码时用的 redirect_uri 一致4、认证服务器向客户端响应令牌 私钥生成令牌{access_token: eyJhbGciOiJSUzI1NiI...,token_type: bearer,refresh_token: eyJhbGciOiTtaBGa6LRtIhzz3Eyjw...,expires_in: 43199,scope: app,jti: a8d04b91-57d16...}5、客户端请求资源服务器的资源资源服务校验令牌合法性完成授权公钥校验令牌资源服务器也要引入相应的依赖创建 config 等才能具有验证令牌合法性的功能6、资源服务器返回受保护资源密码模式密码模式与授权码模式的区别是申请令牌不再使用授权码而是直接通过正确的用户名和密码即可申请令牌 2 JWTJson Web Token JWT Header Payload Signature Header描述 JWT 的元数据包括令牌的类型即 JWT及使用的哈希算法内容用 Base64Url 编码 Payload负载是存放有效信息的地方它可以存放 JWT 提供的字段比如 iss签发者、exp过期时间戳、sub面向的用户等也可自定义字段 Signature签名部分防止 JWT 被篡改 指定的哈希算法( base64UrlEncode(header) . base64UrlEncode(payload), secret)考虑到 Cookie 的容量比较小在 Cookie 中存放 access_tokenHTTP Header 中存放 JWTRedis 中存放 (access_token, JWT refresh_token) 的键值对以供查询使用 JWT 的一个显著优点是资源服务器可以自行认证 JWT而不用传递给认证服务器 3 单点登录和身份校验 单点登录微服务之间相互调用需要验证 JWT 的合法性使用 Feign Interceptor网关在将请求转发到指定微服务前负责检验 JWT 的合法性 1、从 Cookie 查询 access_token 令牌是否存在不存在则拒绝访问 2、从 HTTP Header 查询 JWT 令牌是否存在不存在则拒绝访问 3、从 Redis 中查询 JWT 令牌是否过期过期则拒绝访问具体实现在网关微服务添加 Component Component public class LoginFilter extends ZuulFilter {AutowiredAuthService authService;/*** 过滤器类型pre、routing、post、error*/Overridepublic String filterType() {return pre;}/*** 过滤器序号*/Overridepublic int filterOrder() {return 0;}/*** 是否生效*/Overridepublic boolean shouldFilter() {return true;}/*** 执行过滤操作* 1、从cookie查询用户身份令牌是否存在不存在则拒绝访问* 2、从http header查询jwt令牌是否存在不存在则拒绝访问* 3、验证redis中的jwt是否过期过期则拒绝访问*/Overridepublic Object run() throws ZuulException {RequestContext context RequestContext.getCurrentContext();HttpServletRequest request context.getRequest();HttpServletResponse response context.getResponse();// 1.查询cookie的access_tokenString accessTokenFromCookie this.authService.getAccessTokenFromCookie(request);if (StringUtils.isEmpty(accessTokenFromCookie)) {this.accessDenied();return null;}// 2.查询header的jwtString jwtTokenFromHeader this.authService.getJwtTokenFromHeader(request);if (StringUtils.isEmpty(jwtTokenFromHeader)) {this.accessDenied();return null;}// 3.验证redis中的jwt是否过期Long expire this.authService.checkJwtFromRedis(accessTokenFromCookie);if (expire 0) {this.accessDenied();return null;}return null;} 4 用户授权 RBACRole-Based Access Control 权限就是对资源的控制对 web 应用来说就是对 url 的控制核心为五张数据表用户表、用户角色表、角色表、角色权限表、权限表使用时的查询流程 根据用户ID查询用户角色表获取角色ID 根据角色ID查询角色权限表获取权限ID 根据权限ID查询权限表获取权限 select idselectPermissionByUserId resultTypecom.framework.domain.ucenter.Menuselect id, code, p_id pId, menu_name menuName, url, is_menu isMenu, level, sort, status, icon,create_time createTime, update_time updateTime from Menu where id in (select menu_id from Permission where role_id in (select role_id from User_role where user_id #{userId}))/select获取到的权限被写入 JWT 中在访问微服务前需要校验用户权限是否够在 config 类上注解 EnableGlobalMethodSecurity(prePostEnabled true, securedEnabled true)然后在 Controller 方法注解PreAuthorize(hasAuthority(course_find_list))指定该方法只能被 JWT 中含有 course_find_list 权限的用户调用
http://www.pierceye.com/news/973018/

相关文章:

  • 企业网站栏目设计网站建设求职要求
  • 秀山网站建建个网站的电话号码
  • 东莞网站开发技术公司电话杭州公共资源交易网
  • 网站建设唯地带泰安人才招聘网官方招聘
  • 备案域名一定要建好网站吗广州建企业网站
  • 移动网站建设商八爪鱼 导入 wordpress
  • 建设网站公司哪家性价比高怎么开网店找货源
  • 做图片素材的网站有哪些九宫格网站模板
  • 做网上水果网站的调查海外站推广
  • 苏州外贸公司网站建设流程图企业老板培训课程
  • 北京 做网站比较有名的网站开发html5技术
  • 优质校建设网站建行个人网上登录入口
  • 电话销售做网站打官司八里河网站建设项目建设可行性
  • 做电话销售需要的网站电商网站开发要求
  • 深圳住房和建设局网站网上预约网站和公众号的区别
  • 3g下订单的网站怎么做固定ip如何做网站服务器
  • 条友网seo做得好的企业网站
  • 西宁网站建设报价cu君博規范html5微信网站模板
  • vs做网站添加背景专业微网站建设公司
  • 懒人手机网站模板free wordpress theme
  • 网站内置多语言自建网站如何被百度收录
  • 罗湖网站-建设深圳信科网站建设天猫店
  • 集团制度建设网站网站开发哪好
  • 大数据与网站开发技术做公司网站用什么系统
  • 河南网站建设价格寿光网站建设定制
  • 潍坊 开发区网站建设青海省网络公司
  • 网页设计的网网页设计的网站1688免费货源
  • 哪个网站可以做鞋鉴定濮阳河南网站建设
  • 建站之星如何建网站公司网站百度地图
  • 帮人做ppt的网站网站建设规划设计方案