[完结26章]Java主流分布式解决方案多场景设计与实战

206 阅读4分钟

资料下载地址1:pan.baidu.com/s/1D12W1UdW… 提取码:q5p5 资料下载地址2:share.weiyun.com/KXInzo28 密码:85dqf9

java中常用的分布式方法有哪些呢? 分布式系统分布式存储:GFS,HDFS(HBase) 分布式计算系统: MapReduce 消息中间件: Kafka 分布式处理管理器: Zookeeper RocketMQ : 负载均衡技术 分布式缓存技术: Redis 分布式锁 分布式系统设计 分布式优化策略

众所周知,随着互联网数据井喷式的发展,分布式技术应运而生。分布式因其高性能、高可用、高扩展的特点,成为微服务项目的基石。本篇文章将针对分布式六大主流问题进行多方案对比解析,多场景实战讲解,让大家深度掌握分布式原理和实战。我将分别从源码、手撸框架、实战演练等多个方面进行多维度深入讲解,让你轻松掌握分布式各种解决方案。

多方案设计六大分布式解决方案 1.掌握分布式锁多种解决方案 2.掌握分布式事务多种解决方案 3.掌握分布式ID和分库分表多种解决方案 4.掌握分布式Session和分布式调度解决方案度解决方案

多场景落地六大分布式解决方案 1.实战分布式锁实现高并发引起的超卖问题 2.实战Redisson框架解决用户重复注册问题 3.实战Seata事务解决下订单减库存一致性问题 4.实战Sharding-JDBC实现商品信息管理

下面,我将从代码实战给大家做详细说明: 引入GraceJSONResult,结合枚举对接口返回数据进行优雅的封装 package com.imooc.grace.result;

import java.util.Map;

/**

  • 自定义响应数据类型枚举升级版本

  • @Title: IMOOCJSONResult.java

  • @Package com.imooc.utils

  • @Description: 自定义响应数据结构

  •  		本类可提供给 H5/ios/安卓/公众号/小程序 使用
    
  •  		前端接受此类数据(json object)后,可自行根据业务去实现相关功能
    
  • @Copyright: Copyright (c) 2020

  • @Company: www.imooc.com

  • @author 慕课网 - 风间影月

  • @version V2.0 */ public class GraceJSONResult {

    // 响应业务状态码 private Integer status;

    // 响应消息 private String msg;

    // 是否成功 private Boolean success;

    // 响应数据,可以是Object,也可以是List或Map等 private Object data;

    /**

    • 成功返回,带有数据的,直接往OK方法丢data数据即可
    • @param data
    • @return / public static GraceJSONResult ok(Object data) { return new GraceJSONResult(data); } /*
    • 成功返回,不带有数据的,直接调用ok方法,data无须传入(其实就是null)
    • @return */ public static GraceJSONResult ok() { return new GraceJSONResult(ResponseStatusEnum.SUCCESS); } public GraceJSONResult(Object data) { this.status = ResponseStatusEnum.SUCCESS.status(); this.msg = ResponseStatusEnum.SUCCESS.msg(); this.success = ResponseStatusEnum.SUCCESS.success(); this.data = data; }

    /**

    • 错误返回,直接调用error方法即可,当然也可以在ResponseStatusEnum中自定义错误后再返回也都可以
    • @return */ public static GraceJSONResult error() { return new GraceJSONResult(ResponseStatusEnum.FAILED); }

    /**

    • 错误返回,map中包含了多条错误信息,可以用于表单验证,把错误统一的全部返回出去
    • @param map
    • @return */ public static GraceJSONResult errorMap(Map map) { return new GraceJSONResult(ResponseStatusEnum.FAILED, map); }

    /**

    • 错误返回,直接返回错误的消息
    • @param msg
    • @return */ public static GraceJSONResult errorMsg(String msg) { return new GraceJSONResult(ResponseStatusEnum.FAILED, msg); }

    /**

    • 错误返回,token异常,一些通用的可以在这里统一定义
    • @return */ public static GraceJSONResult errorTicket() { return new GraceJSONResult(ResponseStatusEnum.TICKET_INVALID); }

    /**

    • 自定义错误范围,需要传入一个自定义的枚举,可以到[ResponseStatusEnum.java[中自定义后再传入
    • @param responseStatus
    • @return */ public static GraceJSONResult errorCustom(ResponseStatusEnum responseStatus) { return new GraceJSONResult(responseStatus); } public static GraceJSONResult exception(ResponseStatusEnum responseStatus) { return new GraceJSONResult(responseStatus); }

    public GraceJSONResult(ResponseStatusEnum responseStatus) { this.status = responseStatus.status(); this.msg = responseStatus.msg(); this.success = responseStatus.success(); } public GraceJSONResult(ResponseStatusEnum responseStatus, Object data) { this.status = responseStatus.status(); this.msg = responseStatus.msg(); this.success = responseStatus.success(); this.data = data; } public GraceJSONResult(ResponseStatusEnum responseStatus, String msg) { this.status = responseStatus.status(); this.msg = msg; this.success = responseStatus.success(); }

    public GraceJSONResult() { }

    public Integer getStatus() { return status; }

    public void setStatus(Integer status) { this.status = status; }

    public String getMsg() { return msg; }

    public void setMsg(String msg) { this.msg = msg; }

    public Object getData() { return data; }

    public void setData(Object data) { this.data = data; }

    public Boolean getSuccess() { return success; }

    public void setSuccess(Boolean success) { this.success = success; } }

通过自定义异常,优雅的封装,可以很好的解耦代码,在抛出错误的时候,不必受到其他返回类型的限制。想抛就抛~ /**

  • 统一异常拦截处理

  • 可以针对异常的类型进行捕获,然后返回json信息到前端 */ @ControllerAdvice public class GraceExceptionHandler {

    @ExceptionHandler(MyCustomException.class) @ResponseBody public GraceJSONResult returnMyException(MyCustomException e) { e.printStackTrace(); return GraceJSONResult.exception(e.getResponseStatusEnum()); } }

目前已经结合mq的模型,实现了异步解耦。接下来就需要修改目前的代码。去实现系统消息的发送: 扩展枚举: public enum MessageEnum { FOLLOW_YOU(1, "关注", "follow"), LIKE_VLOG(2, "点赞视频", "likeVideo"), COMMENT_VLOG(3, "评论视频", "comment"), REPLY_YOU(4, "回复评论", "replay"), LIKE_COMMENT(5, "点赞评论", "likeComment");

public final Integer type;
public final String value;
public final String enValue;

MessageEnum(Integer type, String value, String enValue) {
    this.type = type;
    this.value = value;
    this.enValue = enValue;
}

} 根据每次请求的url地址,hash后访问到固定的服务器节点。 upstream tomcats { # url hash hash $request_uri; # 最少连接数 # least_conn

server 192.168.1.173:8080;
server 192.168.1.174:8080;
server 192.168.1.175:8080;

}

server { listen 80; server_name www.tomcats.com;

location / {
    proxy_pass  http://tomcats;
}

} 在nginx目录,输入如下命令进行配置,目的是为了创建makefile文件 @Value("alibaba.teacher.name")privateStringname;@Value("{alibaba.teacher.name}") private String name; @Value("{alibaba.teacher.age}") private Integer age;

@GetMapping("/info") public Object info() { return name + "-" + age; } 本文到此结束,感谢大家的阅读,希望对大家有所帮助!