Introduction to Dubbo
1. What is Dubbo?
Dubbo is an open source Java-based high-performance RPC (a remote invocation) distributed service framework (SOA) for Alibaba, dedicated to providing high-performance and transparent RPC remote service invocation solutions, as well as SOA service governance solutions.
2. Dubbo Architecture
Node role description
node | Role Description |
---|---|
Provider | Exposure service provider |
Consumer | Service consumers invoking remote services |
Registry | Registry of Service Registration and Discovery |
Monitor | Monitoring Center for Statistics of Service Call Number and Time |
Container | Service Running Container |
Call Relation Description
0. The service container is responsible for starting, loading and running the service provider.
1. The service provider registers its services with the registry at startup
2. Service consumers subscribe to the registry for services they need at startup
3. The registry returns the list of service provider addresses to consumers. If there is a change, the registry will push the change data to consumers based on long connections.
4. Service consumers, from the list of provider addresses, select one provider for invocation based on the soft load balancing algorithm, and if the invocation fails, choose another one for invocation.
5. Service consumers and providers, accumulating call times and call times in memory, sending statistic data to monitoring center at regular intervals every minute.
2. SpringBook Integration Dubbo+ZooKeeper Case
ZooKeeper address configuration: IP:Port1,IP:Port2, need to be modified according to the actual situation
1. Ways of using annotations
The project catalogue is structured as follows:
user-api: API Universal Interface
public interface UserService { String sayHello(); }
2) user-service: service provider
pom.xml:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>dubbo</artifactId> <groupId>com.hand</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-service</artifactId> <properties> <spring-boot.version>2.1.1.RELEASE</spring-boot.version> <dubbo.version>2.7.3</dubbo.version> </properties> <dependencyManagement> <dependencies> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Aapche Dubbo --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-bom</artifactId> <version>${dubbo.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.hand</groupId> <artifactId>user-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> </dependency> <!-- Zookeeper dependencies --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>${dubbo.version}</version> <type>pom</type> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
application.properties:
#The default value of dubbo.application.name is spring.application.name spring.application.name=dubbo-auto-configuration-provider-demo #To scan the basic package of dubbo components dubbo.scan.base-packages=com.hand.service.impl #dubbo protocol configuration dubbo.protocol.name=dubbo dubbo.protocol.port=8081 #dubbo Registry Address dubbo.registry.address=zookeeper://IP:Port1,IP:Port2
Main startup class:
package com.hand.service; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @EnableAutoConfiguration public class ServiceApplication { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class); } }
Interface implementation class:
package com.hand.service.impl; import com.hand.user.service.UserService; import org.apache.dubbo.config.annotation.Service; @Service(version = "1.0.0") public class UserServiceImpl implements UserService { public String sayHello() { return "hello world"; } }
3), user-web: service caller
pom.xml:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>dubbo</artifactId> <groupId>com.hand</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-web</artifactId> <properties> <spring-boot.version>2.1.1.RELEASE</spring-boot.version> <dubbo.version>2.7.3</dubbo.version> </properties> <dependencyManagement> <dependencies> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Aapche Dubbo --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-bom</artifactId> <version>${dubbo.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.hand</groupId> <artifactId>user-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Zookeeper dependencies --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>${dubbo.version}</version> <type>pom</type> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
application.properties:
#The default value of dubbo.application.name is spring.application.name spring.application.name=dubbo-auto-configure-consumer-demo #dubbo Registry Address dubbo.registry.address=zookeeper://IP:Port1,IP:Port2
Main startup class:
package com.hand.user; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class WebApplication { public static void main(String[] args) { SpringApplication.run(WebApplication.class); } }
Caller:
package com.hand.user.web; import com.hand.user.service.UserService; import org.apache.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Reference(version = "1.0.0") private UserService userService; @RequestMapping("/sayHello") public String sayHello() { return userService.sayHello(); } }
GitHub address: https://github.com/hxt970311/dubbo-spring boot-annotation-demo
2. Configuration using xml
1), user-service: service provider
Add a new provider.xml to configure the corresponding information of the service provider
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <dubbo:application name="dubbo-auto-configure-consumer-demo"/> <dubbo:registry address="zookeeper://IP:Port1,IP:Port2"/> <dubbo:reference id="userService" check="false" interface="com.hand.user.service.UserService"/> </beans>
Remove the @Service annotation from the specific service implementation class
package com.hand.service.impl; import com.hand.user.service.UserService; public class UserServiceImpl implements UserService { public String sayHello() { return "hello world"; } }
Add the @ImportResource annotation to the startup class
package com.hand.service; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ImportResource; @ImportResource("provider.xml") @EnableAutoConfiguration public class ServiceApplication { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class); } }
2) user-web: service consumers
New consumer.xml
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <dubbo:application name="dubbo-auto-configuration-provider-demo"/> <dubbo:registry address="zookeeper://IP:Port1,IP:Port2"/> <dubbo:protocol name="dubbo" port="8081"/> <bean id="userService" class="com.hand.service.impl.UserServiceImpl"/> <dubbo:service interface="com.hand.user.service.UserService" ref="userService"/> </beans>
Add the @ImportResource annotation to the startup class
package com.hand.user; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; @ImportResource("consumer.xml") @SpringBootApplication public class WebApplication { public static void main(String[] args) { SpringApplication.run(WebApplication.class); } }
Replace @Reference with Spring's @Autowire annotation
package com.hand.user.web; import com.hand.user.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/sayHello") public String sayHello() { return userService.sayHello(); } }
GitHub address: https://github.com/hxt970311/dubbo-spring boot-xml-demo