# dubbo-tutorials-parent **Repository Path**: coder_chenjun/dubbo-tutorials-parent ## Basic Information - **Project Name**: dubbo-tutorials-parent - **Description**: zookeeper与dubbo的基本使用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-12-21 - **Last Updated**: 2022-05-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dubbo hello(无注册中心) ## 服务提供者 ### 依赖 ```xml org.example dubbo-api 1.0-SNAPSHOT org.springframework.boot spring-boot-starter org.apache.dubbo dubbo-spring-boot-starter 2.7.8 ``` ### 提供者实现类 重点是DubboService注解 ```java @DubboService public class ProductServiceImpl implements ProductService { @Override public String getNameById(int id) { System.out.println("wo bei getNameById -----"); return id + "adfa"; } } ``` ### 配置文件 服务名字靠spring.application.name来配置,是必须配置的,端口可以不用配置,默认是20880的 ```yaml spring: application: name: product-provider # 下面的配置是不用注册中心的,重点是那个N/A dubbo: scan: base-packages: com.nf.xxx.service.impl protocol: name: dubbo # port: 20888 registry: address: N/A ``` ### 启动类 ```java @SpringBootApplication public class ProductServiceApplication { public static void main(String[] args) { SpringApplication.run(ProductServiceApplication.class, args); } } ``` ## 服务消费者 ### 依赖 ```xml org.example dubbo-api 1.0-SNAPSHOT org.springframework.boot spring-boot-starter org.apache.dubbo dubbo-spring-boot-starter 2.7.8 ``` ### 消费者 重点是DubboReference注解的url设置 ```java @Service public class OrderServiceImpl { // @Autowired @DubboReference(url = "dubbo://127.0.0.1:20880") private ProductService productService; public void genereateOrder() { String name = productService.getNameById(1); System.out.println("生成订单,产品名字是:" + name); } } ``` ### 配置文件 ```yaml spring: application: name: order-consumer ``` ### 启动类 ```java @SpringBootApplication public class OrderConsumerApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(OrderConsumerApplication.class, args); } @Autowired private OrderServiceImpl orderService; @Override public void run(String... args) throws Exception { orderService.genereateOrder(); } } ``` # 序列化 默认使用的是hessien2,要求类需要实现Serializable接口 ```java public class User implements Serializable { private int id; private String name; //省略 } ``` 接口就可以直接使用,其它地方不需要改变 ```java public interface ProductService2 { User getUser(User user); } ``` ## kryo ```xml org.apache.dubbo dubbo-serialization-kryo 2.7.8 ``` 只需要在服务端配置下面的内容即可 ```xml ``` 可选的优化设置 ```java public class MySerializationOptimizer implements SerializationOptimizer { @Override public Collection> getSerializableClasses() { LinkedList classes = new LinkedList(); classes.add(Aaa.class); return classes; } } ``` ```xml ``` # zookeeper注册中心 采用了zookeeper作为注册中心,代码变化不大,就是提供者与消费者配置需要调整一下 ## 依赖 提供者与消费者都需要与zookeeper通信,所以都需要添加下面的依赖 ```xml org.apache.dubbo dubbo-dependencies-zookeeper 2.7.8 pom ``` ## 提供者配置 提供者只是更改一下配置,代码不需要任何改动 ```yaml spring: application: name: product-provider dubbo: scan: base-packages: com.nf.xxx.service.impl registry: address: zookeeper://127.0.0.1:2181 ``` ## 消费者配置 配置中指定注册中心的地址 ```yaml spring: application: name: order-consumer dubbo: registry: address: zookeeper://127.0.0.1:2181 ``` ## 消费者代码 只需要添加注解,不需要指定url之类的东西,直接到注册中心找提供者信息 ```java @DubboReference() private ProductService2 productService2; ``` ## 负载均衡 ### 单机多提供者实例 在idea中直接复制启动配置,并在启动配置环境变量下配置如下内容即可 ``` dubbo.protocol.name=dubbo;dubbo.protocol.port=20881 ``` 如果实例运行在不同的机器上是不需要上面的操作的,直接就启动多个实例并注册到注册中心去 ### 负载均衡策略 消费者默认采用的是随机策略,可以在DubboReference注解中调整 ```java @DubboReference(loadbalance = "roundrobin") private ProductService productService; ``` loadbalance值有如下几个 - random - roundrobin - leastactive # qos ```xml ``` # 参考资料 - https://segmentfault.com/a/1190000019896723 - https://www.cnblogs.com/twoheads/p/10131656.html (服务路由,负载均衡,集群容错解释较清楚) - https://blog.csdn.net/qq_22152261/article/details/80300597 (dubbo springboot整合使用与dubbo Admin的使用) - https://www.jianshu.com/p/5f7306955482 (zookeeper的说明)