资料下载地址1:https://pan.baidu.com/s/1D12W1UdWxw7uYW3SHAWQiw 提取码:q5p5 资料下载地址2:https://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}") private String name; @Value("${alibaba.teacher.age}") private Integer age;
@GetMapping("/info") public Object info() { return name + "-" + age; } 本文到此结束,感谢大家的阅读,希望对大家有所帮助!