# 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的说明)