资源下载地址:
本博客对应资源路径
https://download.csdn.net/download/dayonglove2018/12967795
下载zookeeper
之前写过一篇关于zookeeper下载,使用
zookeeper下载/安装/使用
下载之后启动zookeeper
目录结构
- 创建项目的时候都创建成maven项目,然后再修改成springboot项目
- 直接创建springboot工程报错了,没有再去处理
父工程
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zjy</groupId>
<artifactId>dubbo</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<modules>
<module>api</module>
<module>provider</module>
<module>consumer</module>
</modules>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<!--lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!--dubbo-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
api子工程
只提供服务接口
目录结构
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.zjy</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>api</artifactId>
</project>
application.properties
spring.application.name=api
UserService
package com.zjy.api.service;
public interface UserService {
Integer add(String id);
String detail(String id);
}
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.zjy</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider</artifactId>
<dependencies>
<!--引入api模块-->
<dependency>
<groupId>com.zjy</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
application.properties
spring.application.name=provider
server.port=2082
dubbo.application.name=dubbo-provider
dubbo.registry.address=127.0.0.1:2181
# 读者请换成自己的zookeeperip
dubbo.registry.protocol=zookeeper
dubbo.registry.check=false
dubbo.monitor.protocol=register
dubbo.consumer.check=false
dubbo.consumer.timeout=3000
dubbo.protocol.name=dubbo
dubbo.protocol.port=30003
ProviderApplication
@EnableDubbo 开户dubbo
package consumer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
UserServiceImpl
package consumer.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.zjy.api.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Override
public Integer add(String id) {
System.out.println("能捃填写来了===========");
return 600;
}
@Override
public String detail(String id) {
System.out.println("能捃填写来了===========");
return "700";
}
}
consumer子工程
服务消费者,服务客户端
目录结构
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.zjy</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consumer</artifactId>
<dependencies>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<!--在引用时请在maven中央仓库搜索最新版本号-->
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
<!--引入api模块-->
<dependency>
<groupId>com.zjy</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
application.properties
spring.application.name=consumer
server.port=2081
# 启动项目自动打开浏览器
openProject.isOpen=true
openProject.cmd=cmd /c start
openProject.web.openUrl=http://localhost:${
server.port}/doc.html#/
dubbo.application.name=dubbo-consumer
dubbo.registry.address=127.0.0.1:2181
# 读者请换成自己的zookeeperip
dubbo.registry.protocol=zookeeper
dubbo.registry.check=false
dubbo.monitor.protocol=register
dubbo.consumer.check=false
dubbo.consumer.timeout=3000
ConsumerApplication
@EnableDubbo 开户dubbo
package com.zjy.consumer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
RunConfig
启动项目自动访问项目地址。这里配置的是启动项目,直接打开浏览器,进入到swagger
package com.zjy.consumer.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RunConfig implements CommandLineRunner {
@Value("${openProject.isOpen}")
private boolean isOpen;
@Value("${openProject.web.openUrl}")
private String openUrl;
@Value("${openProject.cmd}")
private String cmd;
@Override
public void run(String... args){
if(isOpen){
String runCmd = cmd + " " + openUrl ;
System.out.println("运行的命令: " + runCmd);
Runtime run = Runtime.getRuntime();
try {
run.exec(runCmd);
System.out.println("启动浏览器打开项目成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("启动项目自动打开浏览器失败");
}
}
}
}
Swagger2Config
package com.zjy.consumer.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
@EnableKnife4j
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.zjy.consumer.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("swagger-bootstrap-ui RESTful APIs")
.description("swagger-bootstrap-ui")
.termsOfServiceUrl("http://localhost:8999/")
.version("1.0")
.build();
}
}
ProductController
package com.zjy.consumer.controller;
import com.zjy.consumer.model.ResultBO;
import com.zjy.consumer.service.ProductService;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/product")
@RestController
public class ProductController {
/**日志对象*/
private static final Logger logger = LoggerFactory.getLogger(ProductController.class);
@Autowired
private ProductService productService;
@ApiOperation(value = "根据用户id查询商品", notes = "根据用户id查询商品")
@GetMapping("/encrypt")
public ResultBO encrypt(@RequestParam(value = "用户id",required = false) String id){
logger.info("用户id为:{}", id);
ResultBO resultBO = productService.findByUserId(id);
resultBO.setCode(200);
resultBO.setMsg("调用测试接口成功!");
resultBO.setSucceed(true);
logger.info("调用测试接口成功");
return resultBO;
}
@GetMapping("/aaa")
public String aaa(){
return "dfdgfa";
}
}
ResultBO
package com.zjy.consumer.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ResultBO<T> {
@ApiModelProperty(required = true, notes = "返回数据")
private T content;
@ApiModelProperty(required = true, notes = "返回成功与否", example = "true")
private boolean succeed = true;
@ApiModelProperty(required = true, notes = "结果码", example = "200")
private int code = 0;
@ApiModelProperty(required = true, notes = "返回信息说明", example = "SUCCESS")
private String msg;
public ResultBO(T content) {
this.content = content;
}
public ResultBO(boolean succeed, int code, String msg, T content) {
this.succeed = succeed;
this.code = code;
this.msg = msg;
this.content = content;
}
public ResultBO(boolean succeed, int code, String msg) {
this.succeed = succeed;
this.code = code;
this.msg = msg;
}
public ResultBO() {
}
public static <T> ResultBO<T> success(T content) {
return new ResultBO<T>(content);
}
public static ResultBO success() {
return new ResultBO();
}
public static ResultBO fail(int code, String msg) {
return new ResultBO(false, code, msg);
}
public static ResultBO fail(String msg) {
return new ResultBO(false, -1, msg);
}
public static ResultBO fail() {
return fail("fail");
}
}
User
package com.zjy.consumer.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class User {
@ApiModelProperty(required = true, notes = "id", example = "id")
private String id;
@ApiModelProperty(required = true, notes = "用户名", example = "入参用户名")
private String name;
@ApiModelProperty(required = true, notes = "入参信息", example = "入参信息")
private String message;
}
ProductService
package com.zjy.consumer.service;
import com.zjy.consumer.model.ResultBO;
public interface ProductService {
ResultBO findByUserId(String userId);
ResultBO deleteByUserId(String userId);
}
ProductServiceImpl
package com.zjy.consumer.service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zjy.api.service.UserService;
import com.zjy.consumer.model.ResultBO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class ProductServiceImpl implements ProductService {
/**日志对象*/
private static final Logger logger = LoggerFactory.getLogger(ProductServiceImpl.class);
@Reference
private UserService userService;
@Override
public ResultBO findByUserId(String userId) {
String s = userService.detail(userId);
logger.info("获取商品列表====");
return ResultBO.success(s);
}
@Override
public ResultBO deleteByUserId(String userId) {
return null;
}
}
代码贴完了,开始测试
启动zookeeper
启动服务端和客户端(会自动打开浏览器,swagger)
消费者:
提供者:
测试OK!
欢迎大神指导,可以留言交流!
======================
本人原创文章,转载注明出入!
=================