基于 Zookeeper 的配置中心

Spring Cloud Zookeeper Config

依赖

  • 引入 spring-cloud-starter-zookeeper-config 依赖
  • 注意 Zookeeper 版本,Zookeeper 做 同一个项目的服务注册中心和配置中心 版本需要一致

启用

  • 配置 bootstrap.properties | yml
    • spring.cloud.zookeeper.connect-string=localhost:2181
    指定zookeeper的地址
    • spring.cloud.zookeeper.config.enabled=true
    开始zookeeper的配置

Zookeeper 中的数据怎么存

配置项

  • /config/应用名,profile/key=value
  • /config/application,profile/key=value

具体在 实例中操作

如何定制

  • spring.cloud.zookeeper.config.root=config
    指定 config 读取zookeeper路径的开始位置
  • spring.cloud.zookeeper.config.default-context=application
    配置默认的上下文 就是application
  • spring.cloud.zookeeper.config.profile-separator=’,’
    应用名与profile之间的分隔符

实例

zk-config-waiter-service
在这里插入图片描述
需要修改的代码
CoffeeOrder

@Entity
@Table(name = "T_ORDER")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CoffeeOrder extends BaseEntity implements Serializable {
    //加入了折扣 总计金额  服务名
    private String customer;
    @ManyToMany
    @JoinTable(name = "T_ORDER_COFFEE")
    @OrderBy("id")
    private List<Coffee> items;
    @Enumerated
    @Column(nullable = false)
    private OrderState state;
    private Integer discount;
    @Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyMinorAmount",
            parameters = {@org.hibernate.annotations.Parameter(name = "currencyCode", value = "CNY")})
    private Money total;//将金额作为 MinorAmount 保存到数据库
    private String waiter;
}

CoffeeOrderService

@Service
@Transactional
@Slf4j
public class CoffeeOrderService implements MeterBinder {
    @Autowired
    private CoffeeOrderRepository orderRepository;
    @Autowired
    private OrderProperties orderProperties;
    private String waiterId = UUID.randomUUID().toString();//类在构造的时候 生成的UUID

    private Counter orderCounter = null;

    public CoffeeOrder get(Long id) {
        return orderRepository.getOne(id);
    }

    public CoffeeOrder createOrder(String customer, Coffee...coffee) {//创建订单的时候 加入折扣和服务名
        CoffeeOrder order = CoffeeOrder.builder()
                .customer(customer)
                .items(new ArrayList<>(Arrays.asList(coffee)))
                .discount(orderProperties.getDiscount())
                .total(calcTotal(coffee))//计算总金额
                .state(OrderState.INIT)
                .waiter(orderProperties.getWaiterPrefix() + waiterId)
                .build();
        CoffeeOrder saved = orderRepository.save(order);
        log.info("New Order: {}", saved);
        orderCounter.increment();
        return saved;
    }

    public boolean updateState(CoffeeOrder order, OrderState state) {
        if (state.compareTo(order.getState()) <= 0) {
            log.warn("Wrong State order: {}, {}", state, order.getState());
            return false;
        }
        order.setState(state);
        orderRepository.save(order);
        log.info("Updated Order: {}", order);
        return true;
    }

    @Override
    public void bindTo(MeterRegistry meterRegistry) {
        this.orderCounter = meterRegistry.counter("order.count");
    }

    private Money calcTotal(Coffee...coffee) {
        List<Money> items = Stream.of(coffee).map(c -> c.getPrice())
                .collect(Collectors.toList());//取出所有的coffee的price
        return Money.total(items).multipliedBy(orderProperties.getDiscount())//将所有的money加在一起 乘以Discount 除以100 做了一个四舍五入
                .dividedBy(100, RoundingMode.HALF_UP);
    }
}

ConfigurationProperties

@ConfigurationProperties("order")
//加载Properties中 名为order的属性
@RefreshScope
//做Refresh的时候 刷新它
@Data
@Component
//声明成一个bean
public class OrderProperties {
    private Integer discount = 100;
    private String waiterPrefix = "springbucks-";
}

结果分析

在 Docker 中启动consul和zookeeper
在这里插入图片描述
输入 下列命令 连接 /zkCli.sh在这里插入图片描述
进入 之后 创建config
具体 命令 如下:

create /config
create /config/waiter-service
create /config/waiter-service/order.discount 60

创建完毕 之后 查看
在这里插入图片描述
当然 还可以配置 waiterPrefix

开启 程序 使用 postman 去创建一个订单 我们可以看到 discount 变成了60 因为 没有配置 waiterPrefix 所以默认的使用的是springbucks-
在这里插入图片描述

因为 Zookeeper 本身就有一个监听节点的功能 所以 在 程序启动之后 修改 discount 会在控制台 打出 一个日志 它监听到了discount 的变化
在这里插入图片描述
在这里插入图片描述

重新 下一个订单 结果正常
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值