This article goes on to the last article, " Java Micro Services (1): Use of the dubbo-admin console , the previous article introduced the installation of the docker, zookeeper environment, and demonstrated the use of the dubbo-admin console by referring to the Dubbo website.The zookeeper service registry has been set up in the last article. This article mainly builds service consumers and service providers.According to the principle of micro-service, demo is divided into three parts: service interface, service consumer and service consumer.
Service interfaces: All interfaces required by the system are defined.
Service Provider: Mainly the implementation of the interface.
Services consumers: use of interfaces
1. Introduction to Dubbo
node | Role Description |
---|---|
Provider | Service Providers Exposing Services |
Consumer | Service consumer invoking remote service |
Registry | Registry for Service Registration and Discovery |
Monitor | Monitoring Center for Counting Service Calls and Time |
Container | Service Run Container |
The Dubbo architecture is characterized by connectivity, robustness, scalability, and upgrade to the future architecture.
Call Relation Description
- The service container is responsible for starting, loading, and running the service provider.
- Service providers register their services with the registry at startup.
- When service consumers start up, they subscribe to the registry for the services they need.
- The registry returns a list of service provider addresses to the consumer, and if there is a change, the registry will push the change data to the consumer based on a long connection.
- Service consumers, from the list of provider addresses, select a provider to invoke based on the Soft Load Balancing algorithm, and if the call fails, choose another call.
- Service consumers and providers, accumulating calls and call times in memory, regularly send statistics to the monitoring center every minute.
The Dubbo architecture is characterized by connectivity, robustness, scalability, and upgrade to the future architecture.
For a more detailed description, please refer to the official website: http://dubbo.apache.org/en-us/
2. Service Interface
Create a jar project with idea. The process of creating the project can be referred to in Getting started with Spring boot (1): Quickly build a Spring boot project The purpose of this project is to simply define interfaces, so create a jar package directly here, not a maven project.Once created, create a new interface.Here are the interfaces I created:
The UserService code is as follows:
1 package com.edu.hello.dubbo.service.user.api; 2 3 public interface UserService { 4 String sayHi(); 5 }
After creating the interface, you need to install it into a local repository for service consumers and service providers to use
In Terminal, point directly to mvn clean install or click Install directly in the lifecycle directory to install. The following page appears to indicate that the installation was successful
3. Service Providers
The service provider mainly implements the interface. Create a maven project in the same way. The Maven project directory is as follows:
UserServicelmpl is a multiinterface implementation with the following code:
1 package com.edu.hello.dubbo.service.user.provider.api.impl; 2 3 import com.alibaba.dubbo.config.annotation.Service; 4 import com.edu.hello.dubbo.service.user.api.UserService; 5 import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; 6 import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; 7 import org.springframework.beans.factory.annotation.Value; 8 9 /** 10 * @ClassName UserServiceImpl 11 * @Deccription TODO 12 * @Author DZ 13 * @Date 2019/8/31 11:20 14 **/ 15 @Service(version = "${user.service.version}") 16 public class UserServiceImpl implements UserService { 17 18 @Value("${dubbo.protocol.port}") 19 private String port; 20 21 /*@HystrixCommand(commandProperties = { 22 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), 23 @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") 24 })*/ 25 @Override 26 public String sayHi() { 27 return "Say Hello, i am from " + port; 28 } 29 }
The @HystrixCommand note will be mentioned in the fuser later, but it will be noted here first.
The yml configuration is as follows:
1 spring: 2 application: 3 name: hello-dubbo-service-user-provider 4 5 user: 6 service: 7 version: 1.0.0 8 9 dubbo: 10 scan: 11 basePackages: com.edu.hello.dubbo.service.user.provider.api 12 application: 13 id: hello-dubbo-service-user-provider 14 name: hello-dubbo-service-user-provider 15 qos-port: 22222 16 qos-enable: true 17 protocol: 18 id: dubbo 19 name: dubbo 20 port: 12346 21 status: server 22 serialization: kryo #High-speed serialization 23 # optimizer: 24 25 registry: 26 id: zookeeper 27 address: zookeeper://192.168.1.12:2181?back=192.168.1.12:2182,192.168.1.12:2183 28 provider: 29 loadbalance: roundrobin #load balancing 30 31 32 33 management: 34 endpoint: 35 dubbo: 36 enable: true 37 dubbo-shutdown: 38 enabled: true 39 dubbo-configs: 40 enabled: true 41 dubbo-services: 42 enabled: true 43 dubbo-references: 44 enabled: true 45 dubbo-peoperties: 46 enabled: true 47 health: 48 dubbo: 49 status: 50 defaults: memory 51 extras: load,threadpool
The pom file is as follows:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.1.7.RELEASE</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.edu</groupId> 12 <artifactId>hello-dubbo-service-user-provider</artifactId> 13 <version>1.0.0-SNAPSHOT</version> 14 <name>hello-dubbo-service-user-provider</name> 15 <description>Demo project for Spring Boot</description> 16 17 <properties> 18 <java.version>1.8</java.version> 19 </properties> 20 21 <dependencies> 22 <dependency> 23 <groupId>org.springframework.boot</groupId> 24 <artifactId>spring-boot-starter</artifactId> 25 </dependency> 26 <dependency> 27 <groupId>org.springframework.boot</groupId> 28 <artifactId>spring-boot-starter-actuator</artifactId> 29 </dependency> 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-test</artifactId> 33 <scope>test</scope> 34 </dependency> 35 <dependency> 36 <groupId>com.alibaba.boot</groupId> 37 <artifactId>dubbo-spring-boot-starter</artifactId> 38 <version>0.2.0</version> 39 </dependency> 40 <dependency> 41 <groupId>com.edu</groupId> 42 <artifactId>hello-dubbo-service-user-api</artifactId> 43 <version>${project.version}</version> 44 </dependency> 45 <dependency> 46 <groupId>de.javakaffee</groupId> 47 <artifactId>kryo-serializers</artifactId> 48 <version>0.42</version> 49 </dependency> 50 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix --> 51 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix --> 52 <dependency> 53 <groupId>org.springframework.cloud</groupId> 54 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> 55 <version>2.0.1.RELEASE</version> 56 </dependency> 57 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix-dashboard --> 58 <dependency> 59 <groupId>org.springframework.cloud</groupId> 60 <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> 61 <version>2.0.1.RELEASE</version> 62 </dependency> 63 64 65 66 </dependencies> 67 68 <build> 69 <plugins> 70 <plugin> 71 <groupId>org.springframework.boot</groupId> 72 <artifactId>spring-boot-maven-plugin</artifactId> 73 </plugin> 74 </plugins> 75 </build> 76 77 </project>
The pom and yml files in this article are mainly based on the dependency of the service provider's pom files in the dubbo official website. Reference: https://github.com/apache/dubbo-spring-boot-project/tree/master/dubbo-spring-boot-samples/dubbo-registry-zookeeper-samples.
Note the basePackages annotation
4. Service Providers
Create the service provider the same way, the configuration file and the service provider are similar, paste the code directly
1 package com.edu.hello.dubbo.service.user.consumer.controller; 2 3 4 import com.alibaba.dubbo.config.annotation.Reference; 5 import com.edu.hello.dubbo.service.user.api.UserService; 6 import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RequestMethod; 9 import org.springframework.web.bind.annotation.RestController; 10 11 /** 12 * @ClassName UserController 13 * @Deccription TODO 14 * @Author DZ 15 * @Date 2019/8/31 18:37 16 **/ 17 @RestController 18 public class UserController { 19 20 @Reference(version = "${user.service.version}") 21 private UserService userService; 22 23 @HystrixCommand(fallbackMethod = "sayHiError") 24 @RequestMapping(value = "hi", method = RequestMethod.GET) 25 public String sayHi() { 26 return userService.sayHi(); 27 } 28 29 public String sayHiError() { 30 return "Hystrix fallback"; 31 } 32 }
The yml profile and pom profile are basically similar to the provider;
1 spring: 2 application: 3 name: hello-dubbo-service-user-consumer 4 5 user: 6 service: 7 version: 1.0.0 8 9 dubbo: 10 scan: 11 basePackages: com.edu.hello.dubbo.service.user.consumer.controller 12 application: 13 id: hello-dubbo-service-user-consumer 14 name: hello-dubbo-service-user-consumer 15 qos-port: 22223 16 qos-enable: true 17 protocol: 18 id: dubbo 19 name: dubbo 20 port: 12345 21 #status: server 22 serialization: kryo 23 registry: 24 id: zookeeper 25 address: zookeeper://192.168.1.12:2181?back=192.168.1.12:2182,192.168.1.12:2183 26 27 28 management: 29 endpoint: 30 dubbo: 31 enable: true 32 dubbo-shutdown: 33 enabled: true 34 dubbo-configs: 35 enabled: true 36 dubbo-services: 37 enabled: true 38 dubbo-references: 39 enabled: true 40 dubbo-peoperties: 41 enabled: true 42 health: 43 dubbo: 44 status: 45 defaults: memory 46 extras: load,threadpool 47 server: 48 port: 9090
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.1.7.RELEASE</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.edu</groupId> 12 <artifactId>hello-dubbo-service-user-consumer</artifactId> 13 <version>1.0.0-SNAPSHOT</version> 14 <name>hello-dubbo-service-user-consumer</name> 15 <description>Demo project for Spring Boot</description> 16 17 <properties> 18 <java.version>1.8</java.version> 19 </properties> 20 21 <dependencies> 22 <dependency> 23 <groupId>org.springframework.boot</groupId> 24 <artifactId>spring-boot-starter-web</artifactId> 25 </dependency> 26 <dependency> 27 <groupId>org.springframework.boot</groupId> 28 <artifactId>spring-boot-starter-actuator</artifactId> 29 </dependency> 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-test</artifactId> 33 <scope>test</scope> 34 </dependency> 35 <dependency> 36 <groupId>com.alibaba.boot</groupId> 37 <artifactId>dubbo-spring-boot-starter</artifactId> 38 <version>0.2.0</version> 39 </dependency> 40 <dependency> 41 <groupId>com.edu</groupId> 42 <artifactId>hello-dubbo-service-user-api</artifactId> 43 <version>${project.version}</version> 44 </dependency> 45 <dependency> 46 <groupId>de.javakaffee</groupId> 47 <artifactId>kryo-serializers</artifactId> 48 <version>0.42</version> 49 </dependency> 50 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix --> 51 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix --> 52 <dependency> 53 <groupId>org.springframework.cloud</groupId> 54 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> 55 <version>2.0.1.RELEASE</version> 56 </dependency> 57 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix-dashboard --> 58 <dependency> 59 <groupId>org.springframework.cloud</groupId> 60 <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> 61 <version>2.0.1.RELEASE</version> 62 </dependency> 63 </dependencies> 64 65 <build> 66 <plugins> 67 <plugin> 68 <groupId>org.springframework.boot</groupId> 69 <artifactId>spring-boot-maven-plugin</artifactId> 70 <configuration> 71 <mainClass>com.edu.hello.dubbo.service.user.consumer.HelloDubboServiceUserConsumerApplication</mainClass> 72 </configuration> 73 </plugin> 74 </plugins> 75 </build> 76 77 </project>
The code for service fuses and load balancing can be ignored for a while, but fuses are discussed later.
5. Results
Start service consumers and service providers separately, and after successful startup, the following:
Access http://localhost:9090/hi
At the same time, we can start the dubbo-admin console to view the service, noting port conflicts: