Dubbo(来自于阿里巴巴)
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的PRC远程调用服务调用方案。
Dubbo的的特点
- 通过spring配置的方式即可完成服务化,对于应用无入侵。(SpringCloud有一定的入侵)
- 通过maven的install &deploy命令把interface和Model层发布到仓库中,服务调用方只需要依赖interface和model层即可。
- 通过zookeeper设置达到注册服务和心跳检测,通过gateWay前置网关(Clound使用Zuul实现负载均衡将请求转向Eureka服务器)隔绝外部直接调用原子服务的风险
SpringBoot中使用Dubbo
引入依赖
<!--dubbo依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.6</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.1</version> <exclusions> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.7</version> </dependency>
dubbo常用配置及注意事项
1、启动时检查
缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true。
关闭所有服务的启动时检查:(没有提供者时报错)
<dubbo:consumer check="false" />
关闭某个服务的启动时检查:(没有提供者时报错)
<dubbo:reference interface="com.foo.BarService" check="false" />
其它的启动时检查还包括:注册中心 2、直连提供者
在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,
点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表。
<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" /> 3、服务分组
当一个接口有多种实现时,可以用group区分。
provider:
<dubbo:service group="feedback" interface="com.xxx.IndexService" ref="indexServiceFeedback" />
<dubbo:service group="member" interface="com.xxx.IndexService" ref="indexServiceMember" />
cosumer:
<dubbo:reference id="feedbackIndexService" group="feedback" interface="com.xxx.IndexService" />
<dubbo:reference id="memberIndexService" group="member" interface="com.xxx.IndexService" /> 4、多版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
一般处理步骤 1)在低压力时间段,先升级一半提供者为新版本 2)再将所有消费者升级为新版本 3)然后将剩下的一半提供者升级为新版本
<dubbo:service interface="com.foo.BarService" version="1.0.0" />
<dubbo:service interface="com.foo.BarService" version="2.0.0" /> 5、异步调用
可完成并行调用多个远程服务。异步总是不等待返回。
<dubbo:reference id="fooService" interface="com.alibaba.foo.FooService">
<dubbo:method name="findFoo" async="true" />
</dubbo:reference> 6、延迟暴露
如果你的服务需要Warmup时间,比如初始化缓存,等待相关资源就位等,可以使用delay进行延迟暴露。
<dubbo:provider delay="-1" />
当然,也可以配置到服务级别,但有些需要地方需要注意。 7、dubbo:protocol属性
threadpool:线程池类型,可选:fixed/cached ,默认fixed 。
threads :服务线程池大小(固定大小) ,默认为100 payload:请求及响应数据包大小限制,单位:字节,默认为88388608(=8M)
如:<dubbo:protocol name="dubbo" port="27001" threadpool="cached" threads="20"/>
ThreadPool
fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
cached 缓存线程池,空闲一分钟自动删除,需要时重建。
limited可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。 8、dubbo:application
<dubbo:application name="xxx_service" /> name必填。当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样
dubbo生产者配置
dubbo-provider.xml :通过配置xml的方式来配置dubbo服务的提供者
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="usermanage" /> <dubbo:registry id="zookeeper_service" protocol="zookeeper" address="127.0.0.1:2181" timeout="15"/> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" threads="1000" /> <!-- dubbo监控配置 --> <dubbo:monitor protocol="registry" /> <!-- dubbo管理平台接口 --> <bean id="UserService" class="com.luo.service.impl.UserServiceImpl" /> <dubbo:service interface="com.luo.service.IUserService" ref="UserService" registry="zookeeper_service" /> </beans>
在启动类引入配置类
@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的重试机器也能一定程度的保证服务的质量。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="nacos" /> <dubbo:registry id="zookeeper_service" protocol="zookeeper" address="127.0.0.1:2181" timeout="15"/> <!-- 消息推送 --> <dubbo:reference id="user" interface="com.luo.service.IUserService" retries="0" timeout="50000" check="false"/> </beans>
在启动类引入配置类
@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");
}
}
最新评论
mat插件可以检测内存数据
标识接口?
序列化serializabel就是一个标识
就差一个MAC了
mark
除了预置sql查询字段,其他我竟然都没用过
可以,这个问题遇到过
mybatis多个参数: 1. 注解(最常用) 2. 转化为对象或MAP 3. 按顺序(这个最蠢,写的代码看得费劲) 单个参数需要注意得: 1.基本数据类型随便写 2.数组用array,l