最近在自学分布式的一些东西,所以搭建了一个rpc远程调用框架demo,在这里记录一下。
首先创建看看项目结构,我分成了3个服务,api是公共的接口服务。
父项目的pom
<?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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.wrc.rpc</groupId> <artifactId>rpcdemo</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>api</module> <module>provider</module> <module>consumer</module> </modules> <properties> <dubbo.version>0.2.0</dubbo.version> <zookeeper.vsersion>3.4.10</zookeeper.vsersion> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>${zookeeper.vsersion}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement> </project>provider项目的pom
<?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.3.1.RELEASE</version>--> <!-- <relativePath/> <!– lookup parent from repository –>--> <!--</parent>--> <parent> <artifactId>rpcdemo</artifactId> <groupId>com.wrc.rpc</groupId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.wrc.rpc</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <name>provider</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.wrc.rpc</groupId> <artifactId>api</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>需要继承父项目的pom,然后引用。consumer和provider一样即可。
provider项目结构
application.properties配置文件
server.port=9000 #注册名字 dubbo.application.name=provider-demo #zk注册中心地址 dubbo.registry.address=zookeeper://127.0.0.1:2181 #通讯规则 端口 协议 dubbo.protocol.port=20881 dubbo.protocol.name=dubbo启动类
package com.wrc.rpc.provider; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; //引用这个注解,会去扫描dubbo @EnableDubbo @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); System.out.println("发布方启动成功"); } }接口的发布
package com.wrc.rpc.provider.Impl; import com.alibaba.dubbo.config.annotation.Service; import com.wrc.api.HelloDubboApi; import org.springframework.stereotype.Component; /** * @Author: wrc * @Classname HelloImpl * @Description TODO * @Date 2020/7/1 10:01 * @Created wrc */ //service 这里引用dubbo的包,注意! @Service @Component public class HelloImpl implements HelloDubboApi { @Override public String hello(String name) { return "干就完了"+name; } }
consumer的配置文件
dubbo.application.name=consumer dubbo.registry.address=zookeeper://127.0.0.1:2181 server.port=9001启动类
package com.wrc.rpc.consumer; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableDubbo @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); System.out.println("客户端启动成功"); } }接口的调用
package com.wrc.rpc.consumer.Controller; import com.alibaba.dubbo.config.annotation.Reference; import com.wrc.api.HelloDubboApi; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @Author: wrc * @Classname HelloController * @Description TODO * @Date 2020/7/1 10:49 * @Created wrc */ @RestController public class HelloController { @Reference private HelloDubboApi helloDubboApi; @GetMapping("hello") public String getHello(String name){ return helloDubboApi.hello(name); } }
api服务
就一个公共类,需要把这个服务引入发布方和调用方。
package com.wrc.api; /** * @Author: wrc * @Classname HelloDubboApi * @Description TODO * @Date 2020/6/29 10:53 * @Created wrc */ public interface HelloDubboApi { String hello(String name); }服务启动测试
打开zooInspector,zk的可视化软件。
可以看到节点都注册上了
用postman测试
服务调用成功