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 的变化
重新 下一个订单 结果正常