dubbo是一个rpc框架,用来进行微服务化数据传输的,比如我们把web层和service层分开,放在两个服务器上面,那么这本来是一个完整的系统,现在分开了,如何调用原本的功能呢?这就使用dubbo把他们连起来,进行服务调用的传输!
dubbo这里就把service层作为服务提供者(因为一般都是web层调用service),然后web层作为服务消费者。
服务提供者流程:框架启动的时候,会初始化服务实例,通过Proxy组件调用具体的协议(protocol),然后转换成为Exporter,这个时候框架就会打开服务端口,并记录服务实例到内存中,最后通过Registry把服务元数据注册到注册中心中,(说明:Exporter用于暴露到注册中心的对象,持有Invoker对象,也就是对Invoker进行了包装)
消费者消费流程:消费者通过Proxy,它持有Invoker对象,然后触发invoke调用,在调用过程中需要Cluster复杂容错(如果调用失败怎么办?对通过Directory获取所有可以调用的远程服务Invoker列表(集群模式),然后进行负载均衡选出一个invoker重新进行使用),invoke会使用netty client进行传输,将数据包做序列化,然后发送,服务提供者收到数据包,要进行分包,粘包情况的处理,然后对完整数据包进行反序列化,将request放到线程池中,提供服务提供者的过滤器链,最后真正实现完成之后,返回结果到消费端!
springBoot整合dubbo,使用zookeeper作为注册中心
1.在父模块中导入包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.myProject.gmall</groupId>
<artifactId>gmall_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<name>gmall_parent</name>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--dubbo-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- zookeeper-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
</project>
2.将bean和service接口,抽象出来,形成一个api模块
3.服务提供端
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.myProject.gmall</groupId>
<artifactId>gmall_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.myProject.gmall</groupId>
<artifactId>gmall_user_service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gmall_user_service</name>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.myProject.gmall</groupId>
<artifactId>gmall_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意看我的标签,是属于哪一个包的!
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Service
public class UserService implements IUserService {
@Autowired
private UserMapper userMapper;
public List<UmsMember> getAllUser() {
return userMapper.selectAllUser();
}
public List<UmsMemberReceiveAddress> getReceiveAddressByMemberId(String memberId) {
return null;
}
}
applicaiton.yml中配置
dubbo:
application:
name: user-service
protocol:
name: dubbo
port: 20880
registry:
address: zookeeper://192.168.100.134:2181
protocol: zookeeper
scan:
base-packages: com.myproject.gmall.user
启动类中标签开启:
@MapperScan(value = "/com.myproject.gmall.user.mapper")
@SpringBootApplication
@EnableDubbo
public class GmallUserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(GmallUserServiceApplication.class, args);
}
}
4.消费端
pom和服务提供端是差不多的,这里就不重复了!
server:
port: 8080
dubbo:
application:
name: user-web
registry:
address: zookeeper://192.168.100.134:2181
consumer:
timeout: 5000
消费代码,注意@Reference是dubbo的
@Controller
public class UserController {
@Reference
private IUserService userService;
@RequestMapping("/user")
@ResponseBody
public List<UmsMember> getAllUser(){
return userService.getAllUser();
}
}
启动类
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GmallUserWebApplication {
public static void main(String[] args) { SpringApplication.run(GmallUserWebApplication.class, args); }
}
然后就可以运行进行测试了!