SpringBoot中使用dubbo实现RPC调用

Dubbo(来自于阿里巴巴)

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的PRC远程调用服务调用方案。
SpringBoot中使用dubbo实现RPC调用_第1张图片

Dubbo的的特点

  • 通过spring配置的方式即可完成服务化,对于应用无入侵。(Spring Cloud有一定的入侵)
  • 通过maven的install &deploy命令把interfaceModel层发布到仓库中,服务调用方只需要依赖interfacemodel层即可。
  • 通过zookeeper设置达到注册服务和心跳检测,通过gateWay前置网关(Spring Cloud使用Zuul实现负载均衡将请求转向Eureka服务器)隔绝外部直接调用原子服务的风险

SpringBoot中使用Dubbo

引入依赖



    com.alibaba
    dubbo
    2.6.6




    org.apache.curator
    curator-framework
    4.0.1
    
        
            org.apache.zookeeper
            zookeeper
        
    




    org.apache.zookeeper
    zookeeper
    3.4.7

dubbo常用配置及注意事项

1、启动时检查
缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true。


关闭所有服务的启动时检查:(没有提供者时报错)



关闭某个服务的启动时检查:(没有提供者时报错)

其它的启动时检查还包括:注册中心


2、直连提供者
在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,
点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表。
  


3、服务分组
当一个接口有多种实现时,可以用group区分。
provider:




cosumer:




4、多版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
一般处理步骤
1)在低压力时间段,先升级一半提供者为新版本
2)再将所有消费者升级为新版本
3)然后将剩下的一半提供者升级为新版本


5、异步调用
可完成并行调用多个远程服务。异步总是不等待返回。

    



6、延迟暴露
如果你的服务需要Warmup时间,比如初始化缓存,等待相关资源就位等,可以使用delay进行延迟暴露。

当然,也可以配置到服务级别,但有些需要地方需要注意。


7、dubbo:protocol属性
threadpool:线程池类型,可选:fixed/cached ,默认fixed 。
threads :服务线程池大小(固定大小) ,默认为100


payload:请求及响应数据包大小限制,单位:字节,默认为88388608(=8M)
如:


ThreadPool
fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
cached 缓存线程池,空闲一分钟自动删除,需要时重建。
limited可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。


8、dubbo:application

name必填。当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样

dubbo服务提供者配置

dubbo-provider.xml :通过配置xml的方式来配置dubbo服务的提供者




    
    

    
    

    
    

    
    
    



在启动类引入配置类

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@ImportResource({"classpath:*dubbo-provider.xml"})
public class UsermanageAPP extends SpringBootServletInitializer {
    private static Logger logger= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(UsermanageAPP.class);
    }

    /**
     * 项目的启动方法
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(UsermanageAPP.class, args);
        logger.info("======服务已经启动========");
    }
}

服务接口和服务实现类

服务接口

public interface IUserService {
    public String ceshi(String input);
}   

服务的实现类

public class UserServiceImpl implements IUserService {

    @Override
    public String ceshi(String input) {
        return "Hello World,"+input;
    }
}

dubbo服务调用者配置

dubbo-consumer.xml:通过配置xml的方式来配置dubbo服务的消费者
对于核心的业务:

  • retries="0":关闭dubbo超时重试,即 超时不重试
  • 提高timeout(即超时时间),避免由于网络延迟导致业务流程超时

Dubbo的路由机制,会把超时的请求路由到其他机器上,而不是本机尝试,所以 dubbo的重试机器也能一定程度的保证服务的质量。




    
    

    
    

在启动类引入配置类

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, SentinelCircuitBreakerAutoConfiguration.class})
@ImportResource({"classpath:*dubbo-consumer.xml"})
public class NacosApp extends SpringBootServletInitializer {
    private static Logger logger= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(NacosApp.class);
    }

    /**
     * 项目的启动方法
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(NacosApp.class, args);
        logger.info("======服务已经启动========");
    }
}

服务接口和Controller层

服务接口

public interface IUserService {
    public String ceshi(String input);
}

Controller层

@RestController
public class TestController {

    @Autowired
    IUserService userService;

    @RequestMapping("/ceshi")
    public String ceshi(){
        return userService.ceshi("luo");
    }


}

分别启动生产者和消费者,访问消费者接口进行验证:

在这里插入图片描述

项目的源码:github

你可能感兴趣的:(java,java,后端)