Java Micro Services: Service Consumer and Provider Setup

Posted by mephistoo on Sun, 08 Sep 2019 06:44:48 +0200

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
  1. The service container is responsible for starting, loading, and running the service provider.
  2. Service providers register their services with the registry at startup.
  3. When service consumers start up, they subscribe to the registry for the services they need.
  4. 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.
  5. 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.
  6. 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:

Topics: Java Dubbo Spring Maven Apache