1
zhang
2 天以前 5186bf6f2a786775818dc7017ef0bde32cc19201
1
9个文件已修改
13个文件已添加
3个文件已删除
897 ■■■■■ 已修改文件
.idea/algo-java.iml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/compiler.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/encodings.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/jarRepositories.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/misc.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/modules.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/vcs.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md 266 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/pom.xml 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/src/main/java/com/zy/entity/User.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/src/main/java/com/zy/service/UserService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rpc-server/src/main/resources/application.properties 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rpc-server/src/main/resources/application.yml 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rpc-server/target/classes/application.properties 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rpc-server/target/classes/application.yml 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/pom.xml 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/zy/mapper/UserMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/zy/support/UserServiceSupport.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/resources/mapper/system/UserMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/target/classes/mapper/system/UserMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web-server/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web-server/src/main/java/com/zy/controller/UserController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web-server/src/main/resources/application.properties 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web-server/src/main/resources/application.yml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web-server/target/classes/application.yml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/algo-java.iml
New file
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$" />
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>
.idea/compiler.xml
New file
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <annotationProcessing>
      <profile default="true" name="Default" enabled="true" />
      <profile name="Maven default annotation processors profile" enabled="true">
        <sourceOutputDir name="target/generated-sources/annotations" />
        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
        <outputRelativeToContentRoot value="true" />
        <module name="rpc-server" />
        <module name="api" />
        <module name="web-server" />
        <module name="service" />
      </profile>
    </annotationProcessing>
  </component>
  <component name="JavacSettings">
    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
      <module name="rpc-server" options="-parameters" />
      <module name="web-server" options="-parameters" />
    </option>
  </component>
</project>
.idea/encodings.xml
New file
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="file://$PROJECT_DIR$/api/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/api/src/main/resources" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/rpc-server/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/service/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/service/src/main/resources" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/web-server/src/main/java" charset="UTF-8" />
  </component>
</project>
.idea/jarRepositories.xml
New file
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RemoteRepositoriesConfiguration">
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="Maven Central repository" />
      <option name="url" value="https://repo1.maven.org/maven2" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="Central Repository" />
      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="jboss.community" />
      <option name="name" value="JBoss Community repository" />
      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
    </remote-repository>
  </component>
</project>
.idea/misc.xml
@@ -1,4 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="KubernetesApiProvider">{}</component>
  <component name="ExternalStorageConfigurationManager" enabled="true" />
  <component name="KubernetesApiProvider"><![CDATA[{}]]></component>
  <component name="MavenProjectsManager">
    <option name="originalFiles">
      <list>
        <option value="$PROJECT_DIR$/rpc-server/pom.xml" />
        <option value="$PROJECT_DIR$/service/pom.xml" />
        <option value="$PROJECT_DIR$/web-server/pom.xml" />
        <option value="$PROJECT_DIR$/api/pom.xml" />
      </list>
    </option>
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/out" />
  </component>
</project>
.idea/modules.xml
New file
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/.idea/algo-java.iml" filepath="$PROJECT_DIR$/.idea/algo-java.iml" />
    </modules>
  </component>
</project>
.idea/vcs.xml
New file
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="" vcs="Git" />
  </component>
</project>
README.md
@@ -1,64 +1,7 @@
## 介绍
Dubbo是一款高性能、轻量级的开源Java RPC(Remote Procedure
Call,远程过程调用)框架,它提供了分布式系统中服务之间的高效、透明化的服务调用方案。Dubbo最初由阿里巴巴公司开发并开源,现已成为Apache顶级项目。
## 架构演变
在了解dubbo之后,我们要知道dubbo在当今互联网架构中在什么样的位置,我们先来看一个架构演进图
![image-20240611185459491](img/87db65d9f5a8ff7acba7367a440ef7a5.png)
而了解过feign的同学这里就可以拿它和dubbo对比,在上面的图中,feign就是在微服务架构承担rpc框架,而dubbo就在在上面的SOA((Service-Oriented
Architecture,面向服务的架构)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来。)架构中承担rpc框架的角色。
SOA架构,就像是大部门制,一个部门管的事儿比较多,几个相关的工作一块儿干,这样大家协作起来方便,但是部门和部门之间还是得互相配合,有时候沟通多了就复杂了。而且,这种模式下,大家用的工具和流程尽量统一,为了好配合。
微服务架构呢,就像是小团队制,每个小团队就专攻一件事,特别专注,自己管自己那一块,出了问题也不容易影响别人。这种模式灵活多了,每个小团队还能根据自己的喜好选最好的工具干活,更新换代快。不过,这么多小团队,怎么让它们高效合作,也得好好设计一套规则。
## DUBBO
说了这么多,其实dubbo的精髓就是**把自己的api暴露出去给大家,具体的实现继承自己的api去写实现方法。**
但是feign就可以完全脱离api提供,可以提供一个restful的http接口,然后其他服务可以直接通过feign进行调用,这也导致了feign的耦合度更低,但是feign在实际开发过程中也可以模仿dubbo暴露api的方式进行架构的搭建。
之前我们快速演示一下了dubbo,[每天一个新知识之 SpringBoot+Dubbo 的快速入门](https://blog.csdn.net/csdnerM/article/details/125410232)
要使用dubbo首先要搭建一个注册中心,注册中心的目的就是为了让其他的服务调用dubbo服务,在dubbo官方,推荐使用Zookeeper作为注册中心。
[公司居然还在用zookeeper,吓得我马上学习了相关命令!](https://juejin.cn/post/7376930488738938920)
[Linux安装Zookeeper(图文解说详细版)](https://masiyi.blog.csdn.net/article/details/121848173)
> ![在这里插入图片描述](img/a39c0b1e57d24af9aa49d129a81cbe69.jpeg#pic_center)
虽然之前也写过一篇dubbo的快速入门,但是写的简单,时隔两年,这次介绍一些Dubbo的高级特性。
## 框架
我们先从框架的搭建说起
![image-20240615204929083](img/a0907aaaaa99e487ec892bab78e1efeb.png)
这次我们一共建了四个单独的模块,他们没有共同的父模块,但是他们之间有依赖关系,他们之间的关系是这样的:
![image-20240615210608867](img/3f2a3f339c9e70dc7655883a6eff85cb.png)
在service模块中引入了Dubbo的jar包,这样,一套整体的dubbo模块框架就出来了
```
      <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
```
他们的作用分别是:
本项目技术站:
jdk8 + springboot + dubbo + mysql + redis + zookeeper
api模块提供最基础的实体类,枚举类等,最重要是需要暴露出去的抽象接口。
@@ -68,206 +11,9 @@
web-server则是主要提供http接口给第三方,如前端调用,也可以引入其他项目的api模块,之后只要有生产者注入到注册中心就可以提供服务了,直接调用api里面的抽象接口方法。
说这么多,我们来看里面的具体实现代码,由于篇幅问题,请移至代码仓库查看代码:
中科大的老师,负责再service模块里写算法即可
[https://gitee.com/wangfugui-ma/springboot-dubbo/tree/dubbo/](https://gitee.com/wangfugui-ma/springboot-dubbo/tree/dubbo/)
那么,dubbo是需要搭配zookeeper去使用,由于上一篇文章已经讲过了,这里就不再赘述。我们怎么去使用dubbo的一些高级特性呢
## 高级特性
### 序列化
由于我们的实体类是写在api里面的,而api又是供各个项目去引用的,所以如果我们要在其他的项目中获取这个类,例如在这个项目中的queryUser方法中。
```java
package com.zy.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zy.entity.User;
import com.zy.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
    @Reference//远程注入
    private UserService userService;
    @GetMapping("/user")
    public String user() {
        User user = userService.queryUser();
        return user.toString();
    }
}
```
我们的User对象必须实现Serializable接口,例如这样
```java
package com.zy.entity;
import java.io.Serializable;
public class User implements Serializable {
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
```
### 超时
#### 生产者超时
如果我们的生产者需要设置一个超时时间,我们可以在提供方的Service注解中加入timeout属性,就像这样:
```java
package com.zy.support;
import com.alibaba.dubbo.config.annotation.Service;
import com.zy.entity.User;
import com.zy.service.UserService;
import org.springframework.stereotype.Component;
@Service(timeout = 3000)
@Component
public class UserServiceSupport implements UserService {
    /**
     * 查询user
     */
    @Override
    public User queryUser() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        User user = new User();
        user.setAge(18);
        user.setName("王富贵");
        return user;
    }
}
```
这样当我们的controller接口调用超过3秒的时候就会报错:
```
com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout. start time: 2024-06-15 21:24:14.504, end time: 2024-06-15 21:24:17.511, client elapsed: 1 ms, server elapsed: 3006 ms, timeout: 3000 ms, request: Request [id=2, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=queryUser, parameterTypes=[], arguments=[], attachments={path=com.zy.service.UserService, interface=com.zy.service.UserService, version=0.0.0, timeout=3000}]], channel: /10.8.0.136:8061 -> /10.8.0.136:20885
```
这样我们就从生产方加入了超时控制
#### 消费者超时
其实我们也可以从消费者这边控制超时时间,就像这样:
```
package com.zy.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zy.entity.User;
import com.zy.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
    @Reference(timeout = 1000)//远程注入
    private UserService userService;
    @GetMapping("/user")
    public String user() {
        User user = userService.queryUser();
        return user.toString();
    }
}
```
在Reference注解中加入timeout属性也是可以达到一样的效果:
```
com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout. start time: 2024-06-15 21:25:25.398, end time: 2024-06-15 21:25:26.399, client elapsed: 0 ms, server elapsed: 1001 ms, timeout: 1000 ms, request: Request [id=2, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=queryUser, parameterTypes=[], arguments=[], attachments={path=com.zy.service.UserService, interface=com.zy.service.UserService, version=0.0.0, timeout=1000}]], channel: /10.8.0.136:8570 -> /10.8.0.136:20885
```
### @Autowired
除了使用@Reference注解注入dubbo服务外,还可以使用@Autowired去注入dubbo服务
![image-20240625163448223](img/1d70a633d9eb9f22e02faaa4283216b4.png)
### 配置文件
```
dubbo.application.name=web-server
dubbo.registry.address=zookeeper://127.0.0.1:2181
```
在配置文件中写上最基础的两个配置,dubbo.registry.address可以不带zookeeper前缀,但是要加个配置key
```
# 如果不加这个,就需要在address里面加zookeeper://
dubbo.registry.protocol=zookeeper
```
注意这个配置:
```
dubbo.protocol.port=20885
```
dubbo默认用20880端口,如果你需要在一个服务器上面启动多个dubbo服务,那就不能让他们的端口冲突
```
dubbo.registry.password=zk_password
dubbo.registry.username=zk_user
```
如果你的节点有acl权限,则可能需要加上这两个配置,替换value
如果你还不知道acl权限是什么,推荐你看一下这篇文章
[公司居然还在用zookeeper,吓得我马上学习了相关命令!](https://juejin.cn/post/7376930488738938920)
### @EnableDubbo
记得在启动类开启这个注解,否则不能使用dubbo的相关服务,你懂的。。。。
> ![在这里插入图片描述](img/31dc8042deb97d9fdd67c146bd3fac11.png)
1.service已经集成了redis和mysql也都有示例
2.api模块里只要写接口,供第三方系统使用
3.
api/pom.xml
@@ -12,6 +12,81 @@
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <dubbo.version>2.7.8</dubbo.version>
        <curator.version>4.2.0</curator.version>
        <curator-recipes.version>2.8.0</curator-recipes.version>
        <zookeeper.version>3.6.3</zookeeper.version>
    </properties>
    <dependencies>
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <!-- zookeeper注册中心 需要导入zookeeper依赖  -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
            <!-- 提示与zookeeper中的slf4j-log4j12-1.7.29.jar 包冲突-->
            <!--排除这个slf4j-log4j12-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- Zookeeper 客户端 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${curator.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${curator-recipes.version}</version>
        </dependency>
        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.5.12</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
api/src/main/java/com/zy/entity/User.java
@@ -1,32 +1,25 @@
package com.zy.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
@Data
@TableName("sys_user")
public class User implements Serializable {
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    private String username;
    public void setName(String name) {
        this.name = name;
    }
    /**
     * 密码
     */
    private String password;
    public Integer getAge() {
        return age;
    }
    /**
     * 昵称
     */
    private String nickname;
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
api/src/main/java/com/zy/service/UserService.java
@@ -2,6 +2,8 @@
import com.zy.entity.User;
import java.util.List;
//todo 这里写一个自定义注解,之后通过自定义注解来获取该接口和实现类将其注册到注册中心
public interface UserService {
@@ -9,4 +11,10 @@
     * 查询user
     */
    public User queryUser();
    void add(String key, String value);
    String get(String key);
    List<User> getDataByMySql();
}
rpc-server/src/main/resources/application.properties
File was deleted
rpc-server/src/main/resources/application.yml
New file
@@ -0,0 +1,84 @@
spring:
  application:
    name: rpc-server
  mvc:
    static-path-pattern: /**
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jbly?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: xltys1995
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 30000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      test-while-idle: true
      test-on-borrow: true
      test-on-return: false
      remove-abandoned: true
      remove-abandoned-timeout: 1800
      #pool-prepared-statements: false
      #max-pool-prepared-statement-per-connection-size: 20
      filters: stat, wall
      validation-query: SELECT 'x'
      aop-patterns: com.zy.*.*.service.*
      stat-view-servlet:
        url-pattern: /druid/*
        reset-enable: true
        login-username: admin
        login-password: admin
        enabled: true
  servlet:
    multipart:
      maxFileSize: 100MB
      maxRequestSize: 100MB
  jmx:
    enabled: false
  redis:
    host: localhost
    password: xltys1995
    port: 6379
    max: 30
    min: 10
    timeout: 5000
    index: 3
server:
  port: 8082
dubbo:
  application:
    name: rpc-server
  registry:
    address: zookeeper://127.0.0.1:2181
    # protocol: zookeeper
    # password: dreamtech
    # username: zk_user
  protocol:
    name: dubbo
    port: 20880
  monitor:
    protocol: registry
mybatis-plus:
  mapper-locations: classpath:mapper/*/*.xml
  #  global-config:
  #    field-strategy: 0
  configuration:
    #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true
    cache-enabled: true
  global-config:
    :banner: false
    db-config:
      id-type: auto
      logic-delete-value: 1
      logic-not-delete-value: 0
rpc-server/target/classes/application.properties
File was deleted
rpc-server/target/classes/application.yml
New file
@@ -0,0 +1,84 @@
spring:
  application:
    name: rpc-server
  mvc:
    static-path-pattern: /**
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jbly?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: xltys1995
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 30000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      test-while-idle: true
      test-on-borrow: true
      test-on-return: false
      remove-abandoned: true
      remove-abandoned-timeout: 1800
      #pool-prepared-statements: false
      #max-pool-prepared-statement-per-connection-size: 20
      filters: stat, wall
      validation-query: SELECT 'x'
      aop-patterns: com.zy.*.*.service.*
      stat-view-servlet:
        url-pattern: /druid/*
        reset-enable: true
        login-username: admin
        login-password: admin
        enabled: true
  servlet:
    multipart:
      maxFileSize: 100MB
      maxRequestSize: 100MB
  jmx:
    enabled: false
  redis:
    host: localhost
    password: xltys1995
    port: 6379
    max: 30
    min: 10
    timeout: 5000
    index: 3
server:
  port: 8082
dubbo:
  application:
    name: rpc-server
  registry:
    address: zookeeper://127.0.0.1:2181
    # protocol: zookeeper
    # password: dreamtech
    # username: zk_user
  protocol:
    name: dubbo
    port: 20880
  monitor:
    protocol: registry
mybatis-plus:
  mapper-locations: classpath:mapper/*/*.xml
  #  global-config:
  #    field-strategy: 0
  configuration:
    #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true
    cache-enabled: true
  global-config:
    :banner: false
    db-config:
      id-type: auto
      logic-delete-value: 1
      logic-not-delete-value: 0
service/pom.xml
@@ -12,65 +12,49 @@
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <dubbo.version>2.7.8</dubbo.version>
        <curator.version>4.2.0</curator.version>
        <curator-recipes.version>2.8.0</curator-recipes.version>
        <zookeeper.version>3.6.3</zookeeper.version>
    </properties>
    <dependencies>
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <!-- zookeeper注册中心 需要导入zookeeper依赖  -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
            <!-- 提示与zookeeper中的slf4j-log4j12-1.7.29.jar 包冲突-->
            <!--排除这个slf4j-log4j12-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- Zookeeper 客户端 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${curator.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${curator-recipes.version}</version>
        </dependency>
        <dependency>
            <groupId>com.zy</groupId>
            <artifactId>api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- 集成redis依赖  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>
        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>
    </dependencies>
</project>
service/src/main/java/com/zy/mapper/UserMapper.java
New file
@@ -0,0 +1,13 @@
package com.zy.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zy.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
service/src/main/java/com/zy/support/UserServiceSupport.java
@@ -1,26 +1,49 @@
package com.zy.support;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zy.entity.User;
import com.zy.mapper.UserMapper;
import com.zy.service.UserService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.List;
@DubboService // 该注解用于将当前类对象存入spring容器中,既可以本项目服务使用,父接口注解能力也可以提供给其他项目使用
public class UserServiceSupport implements UserService {
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    @Autowired
    private UserMapper userMapper;
    /**
     * 查询user
     */
    @Override
    public User queryUser() {
//        try {
//            Thread.sleep(5000);
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }
        User user = new User();
        user.setAge(18);
        user.setName("张三");
        user.setNickname("1212");
        user.setUsername("张三");
        return user;
    }
    @Override
    public void add(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }
    @Override
    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }
    @Override
    public List<User> getDataByMySql() {
        List<User> users = userMapper.selectList(new QueryWrapper<>());
        return users;
    }
}
service/src/main/resources/mapper/system/UserMapper.xml
New file
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.mapper.UserMapper">
</mapper>
service/target/classes/mapper/system/UserMapper.xml
New file
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.mapper.UserMapper">
</mapper>
web-server/pom.xml
@@ -33,7 +33,7 @@
        <dependency>
            <groupId>com.zy</groupId>
            <artifactId>service</artifactId>
            <artifactId>api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
web-server/src/main/java/com/zy/controller/UserController.java
@@ -5,12 +5,15 @@
import com.zy.service.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
    @DubboReference(timeout = 1000)//远程注入
    @DubboReference(timeout = 1000, check = false)//远程注入
    private UserService userService;
@@ -19,4 +22,21 @@
        User user = userService.queryUser();
        return user.toString();
    }
    @GetMapping("/get")
    public String get() {
        return userService.get("user");
    }
    @GetMapping("/add")
    public String add() {
        userService.add("user", "123");
        return "ok";
    }
    @GetMapping("/user3")
    public List<User> user3() {
        return userService.getDataByMySql();
    }
}
web-server/src/main/resources/application.properties
File was deleted
web-server/src/main/resources/application.yml
New file
@@ -0,0 +1,19 @@
spring:
  application:
    name: web-server
server:
  port: 8083
dubbo:
  protocol:
    name: dubbo
    port: 20885
  application:
    name: web-server
  registry:
    address: zookeeper://127.0.0.1:2181
    # password: dreamtech
    # username: zk_user
  monitor:
    protocol: registry
web-server/target/classes/application.yml
New file
@@ -0,0 +1,19 @@
spring:
  application:
    name: web-server
server:
  port: 8083
dubbo:
  protocol:
    name: dubbo
    port: 20885
  application:
    name: web-server
  registry:
    address: zookeeper://127.0.0.1:2181
    # password: dreamtech
    # username: zk_user
  monitor:
    protocol: registry