第七章 分布式锁&服务注册与发现笔记

本文详细介绍了分布式锁的概念,包括为何需要锁以及不同分布式锁方案的比较,重点讲解了模板方法模式实现的锁以及基于Zookeeper的分布式锁实现。此外,还深入探讨了微服务的本质,不仅仅是负载均衡,还包括服务注册与发现的重要性和主流实现方式,并给出了相应的代码实现逻辑。
摘要由CSDN通过智能技术生成

一、分布式锁

1、为什么需要锁?(一多二写三互斥)

  • 多任务环境中才需要
  • 任务都需要对同一共享资源进行写操作;
  • 对资源的访问是互斥的

任务通过竞争获取锁才能对该资源进行操作(竞争锁);当有一个任务在对资源进行更新时(占有锁),其他任务都不可以对这个资源进行操作(任务阻塞),直到该任务完成更新(释放锁)。

2、分布式锁方案比较

 

2、模板方法模式

在父类中编排主流程,将步骤实现延迟到子类去实现。

 

  • 定义锁的接口Lock
  • 在AbstractLock模板锁里面实现getLock方法,实现通用的逻辑。
  • 不能确实的步骤,作为虚拟方法,甩锅给子类实现。
  • 子类只需要聚焦自己的小步骤逻辑,实现tryLock,waitLock,unLock方法

2.1、模板锁的实现代码如下:

public abstract  class AbstractTemplate {
    public void shopping() {
        Map<String,Float>  cars = new HashMap();
        cars.put("手机",10f);
        cars.put("电视",20f);
        cars.put("电脑",30f);
        checkGoods(cars);//1.清点商品
        float mony = calculation(cars);//2计算价格
        if(pay(mony)) { //支付
            delivery();//如果支付成功送货
        }
    }
    public void checkGoods(Map<String,Float>  cars) {
        if(cars!=null) {
            System.out.print("你购买的了:");
            for(String key:cars.keySet()) {
                System.out.print(key+" ");
            }
            System.out.println();
        }
    }
    public float calculation(Map<String,Float>  cars) {
        float result = 0;
        if(cars!=null) {
            for(String key:cars.keySet()) {
                result += cars.get(key);
            }
        }
        System.out.println("你总共应该支付:"+result);
        return  result;//钱
    }
    public abstract boolean pay(Float money) ;
    public  void delivery() {
        System.out.println("请稍等,正在送货中!");
    }
}

//实现支付方式
public class WxPayTemplate  extends AbstractTemplate{
    public boolean pay(Float money) {
        System.out.println("hankin使用微信支付了:"+money);
        return true;
    }
    public static void main(String[] args) {
       AbstractTemplate at = new WxPayTemplate();
       at.shopping();
    }
}

代码运行结果:

你购买的了:电脑 手机 电视

你总共应该支付:60.0

hankin使用微信支付了:60.0

请稍等,正在送货中!

2.2、使用锁lock的方式实现

public class OrderNumGenerator {
    public  static int count = 0;//全局订单id
    private java.util.concurrent.locks.Lock lock = new ReentrantLock();
    //以lock的方式解决
    public  String getNumber() {
        try {
            lock.lock();
            SimpleDateFormat simpt = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
            String s = simpt.format(new Date()) + "-" + ++count;
            return s;
        }finally {
            lock.unlock();
        }
    }
}

//使用多线程模拟生成订单号
public class OrderService implements Runnable {
    private OrderNumGenerator orderNumGenerator = new OrderNumGenerator();
    private static CountDownLatch countDownLatch = new CountDownLatch(50);
    private static List<String> result = new Vector<String>();
    public void run() {
        try {
            countDownLatch.await();
            result.add(orderNumGenerator.getNumber());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws InterruptedException {
        System.out.println("####生成唯一订单号###");
        OrderService orderService = new OrderService();
        for (int i = 0; i < 50; i++) {
            new Th
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值