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学习 | OpenFeign学习 | Dubbo学习 |
Hystrix学习 |
文章目录
- 系列文章目录
- 前言
- 一、Dubbo介绍
- 1. Dubbo介绍
- 2. Dubbo的主要特点和优势
- 3. Dubbo与OpenFeign相比
- 4. 项目架构
- 二、Dubbo环境配置
- 1. 启动Nacos与Redis环境
- 三、创建dubboapi项目
- 1. 创建Maven项目
- 2. 添加依赖
- 3. 创建Score实体类
- 4. 创建ResultCode工具类
- 5. 创建Result工具类
- 6. 创建ScoreService接口
- 7. 打包
- 四、创建dubboconsumer项目
- 1. 创建Maven项目
- 2. 添加依赖
- 3. 创建SessionConfig配置类
- 5. 创建User实体类
- 6. 创建UserService接口
- 7. 创建UserServiceImpl实现类
- 9. 创建UserController控制器
- 10. 创建SpringBootMain启动类
- 创建application.properties配置文件
- 创建application.yml配置文件
- 创建bootstrap.yml配置文件
- 五、创建dubboprovider项目
- 1. 创建Maven项目
- 2. 添加依赖
- 3. 创建SessionConfig配置类
- 4. 创建ScoreServiceImpl实现类
- 5. 创建SpringBootMain启动类
- 6. 创建application.properties配置文件
- 7. 创建application.yml配置文件
- 8. 创建bootstrap.yml配置文件
- 9. 启动程序
- 总结
前言
本文我们要讲述:
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:实现项目间通信
在下攸攸太上,我都写了四十多篇文章了,确实有点编不出来了!呜呜!