springboot结合dubbo使用
dubbo结合spring需要在配置文件中配置,结合springboot时就可以使用application.yml配置文件或者application.properties。个人更喜欢结合springboot的使用。
不说那么多了,从代码中得到的才是最深沉的。
创建一个maven项目
创建一个springboot提供者的module
step0:创建好后pom.xml中引入jar包依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--web项目-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--dubbo ali apache-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</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>
<dependency>
<groupId>com.itzz</groupId>
<artifactId>dubbo02-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
step1把application.properties文件的后缀改为.yml后缀,配置文件中的配置
dubbo:
application:
name: dubbo02-provider
registry:
address: zookeeper://localhost:2181
protocol:
port: 20880
name: dubbo
scan:
base-packages: com.itzz.provider.service.Impl
#自定义当前应用版本号
application:
version: 1.0.0
#修改web项目启动默认的端口号
server:
port: 8081
创建相关的包结构,然后再service的Impl包中创建相关的功能
import com.itzz.provider.service.UserService;
import org.apache.dubbo.config.annotation.Service;
@Service(version = "${application.version}")
public class UserServiceImpl implements UserService {
@Override
public String getName(int id) {
System.out.println("------1------");
if (id == 1){
return "张三";
}else if (id == 2){
return "李四";
}
return "傻蛋";
}
}
@Service(version = “${application.version}”)中引用配置文件中的版本号,假如以后版本升级了,总不能一个一个的更改吧,所以加入相关的注解。我的包结构如下所示:
创建一个api的module(maven结构的module)
在api的module中创建跟提供者的module一样的包结构
public interface UserService {
public String getName(int id);
}
包结构
创建一个消费者的spring boot的module
step0:pom.xml的jar包
<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.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.7.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>
<dependency>
<groupId>com.itzz</groupId>
<artifactId>dubbo02-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
一定要引入api的依赖,不然会报错,说找不到UserService接口
step1:springboot自动生成的配置文件后缀还是改成.yml后缀。跟之前结合spring的时候用的配置信息一样。
dubbo:
application:
name: dubbo02-consumer
registry:
address: zookeeper://localhost:2181
scan:
base-packages: com.itzz.provider.service.Impl
#自定义当前应用版本号
application:
version: 1.0.0
#修改web项目启动默认的端口号
server:
port: 8082
step2:创建web层,web直接调用接口中定义的方法。
import com.itzz.provider.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Reference(version = "${application.version}")
private UserService userService;
@RequestMapping("getName")
public String getName(Integer id){
return userService.getName(id);
}
}
包结构如下:
到这里项目就敲完了,先启动提供者的主类,然后再启动消费者的主类剩下的就是在管理中心里进行测试了。
在控制中心测试
在网页中输入http://localhost:7001/进入到管理中心(当然前提是你的管理中心启了着的)。再加一个提供者跟上面的功能一样,做一个提供者集群。
然后看两个是否都已经注册到了监控中心中了
通过消费者的端口在网页的url中访问,如下所示:
权重
权重:我在第二个提供的实现类上配置了权重为300,所以访问的几率就会比第一个提供者的次数多。
禁用就是禁止使用,不再用这个提供者了。
服务中心中显示的
负载均衡策略
dubbo的负载均衡策略是随机访问的。因为dubbo默认的负载均衡策略就是随机的,除了随机还有轮询(两个提供者挨着来)、并发最小(好比排队哪里人少去哪里)。
随机策略
权重都一样时才会随机
轮询策略
访问提供者的次数是一样多的。