0%

数据结构的存储方式

包括顺序存储方式、链式存储方式、索引存储方式、散列存储方式

顺序存储方式

顺序存储方式是在一块连续的存储区域进行存放数据,把逻辑上相邻的节点存储在物理位置上相邻的存储单元里,节点间的逻辑关系由存储单元的邻接关系来体现,主要用于线性逻辑结构的数据存放,如数组

  • 数组查询比较方便,根据下标就可以找到元素,时间复杂度为O(1);增加和删除比较复杂,需要移动操作数所在位置后的所有数据,时间复杂度为O(N)
  • 数组必须先定义固定长度
阅读全文 »

dubbo简介

dubbo官网 https://dubbo.apache.org/zh/

Dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力,其包含四大组件

  • Provider 服务提供者
  • Consumer 服务消费者
  • Registry 服务注册中心,提供目录服务
  • Monitor 服务监控中心,可以统计服务的调用次数、调用时间等信息的日志服务

组件依赖关系

阅读全文 »

dubbo配置

提供者配置示例

1
2
3
4
5
6
7
8
9
10
11
<!-- 服务提供者应用名称 -->
<dubbo:application name="provider01"/>

<!-- 连接zookeeper注册中心 -->
<dubbo:registry address="zookeeper://localhost:2181"/>

<bean id="demoService" class="com.zhanghe.study.dubbo_provider.service.DemoServiceImpl"/>

<!-- 注册服务提供者,interface为服务提供者接口 ref为真正的服务提供者 registry设置为 N/A表示不注册到注册中心 -->
<dubbo:service interface="com.zhanghe.study.service.DemoService"
ref="demoService"/>

消费者配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- 服务消费者应用名称 -->
<dubbo:application name="consumer01"/>

<!-- 连接zookeeper注册中心 -->
<dubbo:registry address="zookeeper://localhost:2181"/>

<!-- 消费,interface 从注册中心获取指定名称的服务
cache="true" 服务级别缓存结果,从服务提供者获取到结果之后进行缓存,下一次调用相同的不会再次访问提供者-->
<dubbo:reference id="demoService"
interface="com.zhanghe.study.service.DemoService"
cache="true"
>
<!-- 方法级别的缓存
- lru 默认的缓存,默认可以缓存1000个结果
- threadlocal 当前线程缓存
- jcache 可以桥接其他缓存实现
-->
<dubbo:method name="sayHello" cache="lru">

</dubbo:method>
</dubbo:reference>

六大原则

一、开闭原则

对扩展开放,对修改关闭

二、里氏代换原则

只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常

三、依赖倒转原则

面向接口编程,依赖于抽象而非具体

四、接口隔离原则

使用多个隔离的接口,比使用单个接口更好,降低类之间的耦合度

五、迪米特原则

一个实体应当尽量少的与其他实体之间发生相互作用,弱耦合

六、单一职责原则

一个接口或类只有一个职责

kafka消息顺序问题

虽然kafka保证了分区的有序,但是如果生产者消息重试可能会对消息顺序产生影响。

在发送消息时,本应该先发送A在发送B,但是A发送失败了,B发送成功了,A在重试之后发送成功了,就导致了本来顺序应该是AB而变成了BA,如果需要严格的顺序,可以在生产者中配置参数max.in.flight.requests.per.connection为1,该参数的作用是设置每个连接的最大请求个数,默认5,如果将该值设置为1,可以保证在出现重试的情况下依然保证消息是按照发送顺序来写入服务器的

使用max.in.flight.requests.per.connection=1会降低吞吐量