Dubbo学习

系列文章目录

JavaSE
基础知识、数据类型学习万年历项目代码逻辑训练习题
代码逻辑训练习题方法、数组学习图书管理系统项目
面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习
集合学习IO流、多线程学习仓库管理系统JavaSE项目
员工管理系统、多表查询、反射实现DBHelper学习DML、DDL、数据库对象学习
JavaWeb
网络编程、各种标签、CSS学习ECMAScript、BOM学习DOM、jQuery学习
Servlet、JSP、Cookie、Ajax学习融资管理系统JavaWeb项目
框架
MyBatis框架学习逆向工程、Spring框架IOC、AOP学习SpringMVC框架学习
SpringBoot框架学习招聘网站框架项目Vue介绍、窗体内操作、窗体间操作学习
Vue路由配置、网络请求访问框架项目、element组件介绍学习标准管理系统Vue项目
微服务
Linux安装、Nginx反向代理、负载均衡学习Docker学习Jenkins学习
Nexus学习Spring Security学习RabbitMQ学习
Redis学习MongoDB学习MongoDB学习
Nacos学习Spring Session学习Spring Gateway学习
JSR 303学习Dubbo学习


前言

本文我们要讲述:
Dubbo
在下攸攸太上,这是我的二维码▩。


一、Dubbo介绍

1. Dubbo介绍

Dubbo是一个开源的高性能微服务框架,由阿里巴巴开发并后来捐赠给了Apache基金会。它提供了一种高效、可靠的RPC(远程过程调用)通信框架,用于构建分布式的服务化架构。

2. Dubbo的主要特点和优势

高性能:Dubbo通过优化网络通信、序列化、线程池等方面的机制,提供了高性能的服务调用能力,适用于高并发、低延迟的场景。
可扩展性:Dubbo支持多种协议、负载均衡、服务注册与发现等扩展点,可以根据需求扩展和定制化。
高可用性:Dubbo提供了服务治理、负载均衡、故障转移等机制,确保服务的高可用性和容错能力。
透明化的远程调用:Dubbo对服务调用进行了封装,使得调用方无需关注底层的网络通信细节,可以像调用本地方法一样调用远程服务。
配置管理:Dubbo提供了丰富的配置管理功能,可以通过配置中心进行动态的配置管理和版本控制。
监控和管理:Dubbo提供了丰富的监控和管理功能,可以对服务进行监控、统计和管理。

3. Dubbo与OpenFeign相比

与OpenFeign相比,Dubbo是基于RPC协议实现的微服务框架,而OpenFeign是基于HTTP请求的方式实现的。Dubbo的通信方式更加高效和灵活,适用于复杂的微服务场景。而OpenFeign是Spring官方提供的工具,更加简洁易用,适合于快速开发和集成Spring Boot项目。

4. 项目架构

在应用Dubbo框架时,通常需要创建三个工程:API工程、消费者工程和提供者工程。API工程是共享的代码库,包含服务接口和共享的实体类等。消费者工程和提供者工程可以引用API工程,通过Dubbo框架实现服务的调用和提供。

二、Dubbo环境配置

1. 启动Nacos与Redis环境

docker start nacos
docker start redis-6379

在这里插入图片描述

三、创建dubboapi项目

1. 创建Maven项目

在这里插入图片描述
在这里插入图片描述

2. 添加依赖

    <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.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
        <spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--2.添加当前项目所依赖的插件: -->
    <build>
        <plugins>
            <!--1.添加tomcat插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
            <!--2.添加Spring Boot 的打包插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.10.RELEASE</version>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

3. 创建Score实体类

package com.jjy.entry;

import lombok.Data;
import java.io.Serializable;

@Data
public class Score implements Serializable {
    private String name;
    private Double score;
}

4. 创建ResultCode工具类

package com.jjy.util;

public enum ResultCode {
    SUCCESS(0, "请求成功"),
    ERROR(1, "请求失败"),
    ;

    private int code;
    private String message;

    ResultCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

5. 创建Result工具类

package com.jjy.util;

import lombok.Data;
import java.util.HashMap;
import java.util.Map;

@Data
public class Result {

    private Integer code;
    private String message;
    private Map<String, Object> map = new HashMap<>();

    private Result() {
    }

    public static Result ok() {
        Result r = new Result();
        r.setCode(ResultCode.SUCCESS.getCode());
        r.setMessage(ResultCode.SUCCESS.getMessage());
        return r;
    }

    public static Result error() {
        Result r = new Result();
        r.setCode(ResultCode.ERROR.getCode());
        r.setMessage(ResultCode.ERROR.getMessage());
        return r;
    }

    public Result put(String key, Object value) {
        map.put(key, value);
        return this;
    }

    public Object get(String key) {
        return map.get(key);
    }
}

6. 创建ScoreService接口

package com.jjy.service;

import com.jjy.entry.Score;
import java.util.List;

public interface ScoreService {

    public List<Score> getinfo();

}

7. 打包

在这里插入图片描述
在这里插入图片描述
可以拿到dubboapi-1.0-SNAPSHOT.jar文件

四、创建dubboconsumer项目

1. 创建Maven项目

在这里插入图片描述
在这里插入图片描述

2. 添加依赖

我们可以看到,依赖中导入了dubboapi项目的jar包,这样我们就可以在此项目中使用dubboapi编写的类

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.7.RELEASE</version>
    </parent>

    <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.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
        <spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--引入api工程依赖 -->
        <dependency>
            <groupId>com.jjy</groupId>
            <artifactId>dubboapi</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--引入dubbo依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

dubboapi-1.0-SNAPSHOT.jar可能爆红,多导入几次,实在不行就lib导入

        <dependency>
            <groupId>com.jjy</groupId>
            <artifactId>dubboapi</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

3. 创建SessionConfig配置类

package com.jjy.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;

@Configuration
public class SessionConfig {

    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("JSESSIONID");
        serializer.setCookiePath("/");
        serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
        return serializer;
    }

    @Bean
    public RedisSerializer<Object> redisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
}

5. 创建User实体类

package com.jjy.entry;

import lombok.Data;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@Data
@EnableDubbo
public class User {

    private String id;
    private String name;
    private String password;
    private List<Score> scoreList;
}

6. 创建UserService接口

package com.jjy.service;

import com.jjy.entry.User;

public interface UserService {

    public User getinfo();
}

7. 创建UserServiceImpl实现类

package com.jjy.service.impl;

import com.jjy.entry.Score;
import com.jjy.service.ScoreService;
import com.jjy.entry.User;
import com.jjy.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.config.annotation.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Reference
    private ScoreService scoreService;

    @Override
    public User getinfo() {
        User user=new User();
        user.setId("111");
        user.setName("zhangsan");
        user.setPassword("zs123");
        List<Score> list=scoreService.getinfo();
        user.setScoreList(list);
        return user;
    }
}

9. 创建UserController控制器

package com.jjy.controller;

import com.jjy.service.UserService;
import com.jjy.entry.User;
import com.jjy.util.Result;
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.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public Result getinfo(){
        User user = userService.getinfo();
        return Result.ok().put("data",user);
    }
}

10. 创建SpringBootMain启动类

package com.jjy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@SpringBootApplication
@EnableRedisHttpSession
public class SpringBootMain {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMain.class,args);
    }
}

创建application.properties配置文件

spring.application.name=dubbocon

创建application.yml配置文件

server:
  port: 100

spring:
  session:
    store-type: redis

dubbo:
  registry:
    address: nacos://192.168.81.186:8848
  cloud:
    subscribed-services: dubbopro   #是要访问的p工程的服务名
  consumer:
    check: false

创建bootstrap.yml配置文件

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.81.186:8848
      config:
        server-addr: 192.168.81.186:8848
        file-extension: yaml
        namespace: 7e56a725-f51a-4603-b421-49add0ae9c4b # 命名空间ID,粘贴复制过来即可。
        shared-configs:
          - data-id: redissession1.yaml    # 配置详情内:Data ID,粘贴复制过来即可。
            group: DEFAULT_GROUP           # 配置详情内:Group 粘贴复制过来即可。
    inetutils:
      preferred-networks: 192.168.56 # 服务管理内,public内点击详情,可以查看,需要项目启动后能查看,一般默认192.168.56

五、创建dubboprovider项目

1. 创建Maven项目

在这里插入图片描述
在这里插入图片描述

2. 添加依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.7.RELEASE</version>
    </parent>

    <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.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
        <spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--引入api工程依赖 -->
        <dependency>
            <groupId>com.jjy</groupId>
            <artifactId>dubboapi</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--引入dubbo依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

3. 创建SessionConfig配置类

package com.jjy.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;

@Configuration
public class SessionConfig {

    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("JSESSIONID");
        serializer.setCookiePath("/");
        serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
        return serializer;
    }

    @Bean
    public RedisSerializer<Object> redisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
}

4. 创建ScoreServiceImpl实现类

package com.jjy.service.impl;

import com.jjy.entry.Score;
import com.jjy.service.ScoreService;
import org.apache.dubbo.config.annotation.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class ScoreServiceImpl implements ScoreService {
    @Override
    public List<Score> getinfo() {
        List<Score> list=new ArrayList<>();
        for(int i=0;i<3;i++){
            Score score=new Score();
            score.setName("admin");
            score.setScore(Math.random()*100);
            list.add(score);
        }
        return list;
    }
}

5. 创建SpringBootMain启动类

package com.jjy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@SpringBootApplication
@EnableRedisHttpSession
public class SpringBootMain {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMain.class,args);
    }
}

6. 创建application.properties配置文件

spring.application.name=dubbopro

7. 创建application.yml配置文件

server:
  port: 200

spring:
  session:
    store-type: redis

dubbo:
  scan:
    base-packages: com.jjy.service  #指定把哪一个包下面的Servlet交给dubbo去管理。
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://192.168.81.186:8848
  cloud:
    subscribed-services: ""

8. 创建bootstrap.yml配置文件

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.81.186:8848
      config:
        server-addr: 192.168.81.186:8848
        file-extension: yaml
        namespace: 7e56a725-f51a-4603-b421-49add0ae9c4b # 命名空间ID,粘贴复制过来即可。
        shared-configs:
          - data-id: redissession1.yaml    # 配置详情内:Data ID,粘贴复制过来即可。
            group: DEFAULT_GROUP           # 配置详情内:Group 粘贴复制过来即可。
    inetutils:
      preferred-networks: 192.168.56 # 服务管理内,public内点击详情,可以查看,需要项目启动后能查看,一般默认192.168.56

9. 启动程序

必须先启动consumer项目,再启动provider项目
启动postman发送请求
选择GET请求,输入http://127.0.0.1:100/user地址,点击send
在这里插入图片描述
出现请求成功字样即为成功。
在这里插入图片描述


总结

本文讲述了:
Dubbo:实现项目间通信
在下攸攸太上,我都写了四十多篇文章了,确实有点编不出来了!呜呜!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攸攸太上

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值