dubbo是什么: dubbo是一个阿里巴巴开发的开源分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴集团的各成员站点的核心框架,天天为2,000+个服务提供3,000,000,000+次访问量支持。dubbo是对一个系统中应用层上的优化,后面我会在对系统中数据库层面的优化进行分享,这里咱们只针对dubbo进行学习java
dubbo能解决什么问题: 当网站变大后,不可避免的须要拆分应用进行服务化,以提升系统性能,开发效率等。而且要求拆分出去的每一个服务能够根据须要灵活的配置它的集群数量和控制服务的粒度(服务的粒度就是说我运行的服务系统中对外发布的服务数量)mysql
dubbo的优势: 一、使用简单 二、部署轻盈 三、方便二次开发 当当网:dubboX 京东:jd-hydra 这些都是基于dubbo二次开发的框架web
分布式应用:应用程序分布在不一样计算机上,经过网络来共同完成一项任务。一般为服务端/客户端模式。 服务器/客户端又分为二端(server/client)、三端(server/middleware/client)、N端(multiple server/multiple minddle/multiple client)。也就是说分布式应用须要把服务(service)拆分出来,单独部署在一个web服务器中,controller调用service就经过网络来调用,这就造成了客户端和服务端的模式,客户端只负责运行controller代码,处理数据请求和响应;服务端只负责业务处理,数据运算等。又由于本来一个系统既须要处理用户的请求和响应,又须要处理业务流程,运行压力会比较大,从而影响整个系统的性能。如今把系统一分为二了,这就大大的提升整个系统的性能了spring
上面说到了分布式的应用分红客户端和服务端,它们各自运行在本身的服务器中,客户端的controller调用服务端的service就不是在一个应用内调用了,而是经过网络传输来调用。 这种经过网络来使controller调用远程的service的技术叫作RPC技术。sql
RPC技术是什么: RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种经过网络从远程计算机程序上请求服务 RPC的原理: 就是对象的序列化、反序列化以及序列化后数据的传输,dubbo(使用二进制文件,TCP) java领域常见的RPC框架: Java领域里的分布式技术或者说分布式框架叫作RPC框架有:Dubbo,ZeroICE数据库
使用分布式的模式的优势? 1.在开发上,分红了多个系统,有利于开发任务的分配,各自负责各自的系统开发。 2.在运行上,把负载压力分配到多台服务器上,提升整个系统的运行性能。 3.因为分布式开发模式是把业务或者功能以服务的形式对外发布,这样的话能够提升服务重用率apache
用了dubbo的优势? 拆分应用进行服务化,提升系统性能,开发效率,而且能够灵活配置服务集群数和控制服务api
注册中心的做用: 一、服务端服务的注册和客户端服务的调用 二、提升系统的可用性 三、提升系统的可伸缩性 四、集中管理服务tomcat
注册中心有什么: zookeeper: zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。springboot
zookeeper的使用 虽然能提供给dubbo应用作注册中心的技术有不少,可是咱们用的是zookeeper,由于它是dubbo官方推荐的技术,在springboot-dubbo中,也是默认整合了zookeeper。并且zookeeper它是Hadoop和HBase的重要组件,若是后期项目须要发展大数据业务,那么就能够无缝的接入大数据的技术。因此咱们使用zookeeper做为基于dubbo框架的分布式系统的注册中心。
1,下载zookeeper运行程序 进入zookeeper官网:zookeeper.apache.org/下载 2,修改配置文件 zoo_sample.cfg修改为zoo.cfg(能够copy一份再修改) # 内存数据的备份地址 dataDir=F://zookeeper-3.4.5//data
dataLogDir=F://zookeeper-3.4.5//log
复制代码
3,双击bin目录下的zkServer.cmd,运行zookeeper(若是是Mac路径就不说了,启动须要到bin目录下在终端使用命令 sh zkServer.sh start)
这里我使用的工具是idea 先建立一个父项目(dubbo_parent),而后再建立三个模块
一个用于服务端,一个用于客户端,一个用于接口 服务端:server 客户端:client 接口:api 而后咱们来修改pom.xml配置,这了api项目只是提供接口不须要继承dubbo_parent的依赖因此在api的pom.xml里取消继承的配置. 同时咱们在server和client须要api的接口,因此咱们须要在server,client两个项目中导入api的依赖
<dependencies>
<dependency>
<groupId>com.jd.dubbo</groupId>
<artifactId>api</artifactId>
</dependency>
</dependencies>
复制代码
springboot父项目:spring-boot-starter-parent springbootweb相关项目spring-boot-starter-web
<!--Spring Boot项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<dependencies>
<!--spring-boot-web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo相关依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5</version>
</dependency>
</dependencies>
复制代码
建立服务端的启动类
@SpringBootApplication
@ImportResource("classpath:dubbo-server.xml")
public class StartApp {
public static void main(String[] args) {
SpringApplication.run(StartApp.class,args);
}
}
复制代码
<!--把具体的服务实现类交给spring容器管理-->
<bean id="helloWorld" class="com.jd.dubbo.service.impl.HelloWorldServiceImpl"/>
<!--设置应用名-->
<dubbo:application name="dubbo-server"/>
<!--设置RPC协议-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--设置注册中心地址zookeeper,register属性,默认是true,若是为true的化,就须要把发布的服务的服务地址注册到zookeeper
若是为false,就不须要把服务的地址注册到zookeeper中
-->
<!--<dubbo:registry address="zookeeper://127.0.0.1:2181" register="false"/>-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" register="true" file="${user.home}/dubbo.cache"/>
<!--发布服务-->
<dubbo:service interface="com.jd.dubbo.service.IHelloWorldService" ref="helloWorld"/>
复制代码
<!--设置应用名-->
<dubbo:application name="dubbo-client"/>
<!--设置注册中心地址zookeeper-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--引用服务-->
<dubbo:reference interface="com.jd.dubbo.service.IHelloWorldService" id="helloWorldService"/>
复制代码
@SpringBootApplication
@ImportResource("classpath:dubbo-client.xml")
@Controller
public class StartApp {
@Autowired
private IHelloWorldService helloWorldService;
public static void main (String[] args){
SpringApplication.run(StartApp.class,args);
}
@RequestMapping("/sayHello")
@ResponseBody
public String sayHello(){
HelloWorld helloWorld =helloWorldService.sayHello(new HelloWorld());
return helloWorld.getName();
}
}
复制代码
到这里咱们经过xml的配置方式已经完成了,咱们先启动服务端server再启动客服端client
基于springboot全注解的方式构建的好处 一、Springboot给咱们提供了一整套开发包,导入一个依赖就能使用它给咱们提供的对应的功能,提升咱们的开发效率 二、减小了咱们应用本身导入依赖包的数量 三、省去了繁琐的xml配置文件 四、内嵌web服务器:如tomcat,jetty,部署应用变得方便 五、用springboot整合dubbo能够很方便的开发分布式的微服务
1、建立各个工程项目
shop_parent shop_api_goods(商品系统的api) shop_api_order(订单系统的api) shop_server_goods(商品系统) shop_server_order(订单系统) shop_client_mgrsite(后台管理系统) shop_clinet_website(移动端接口)
先建立一个父项目而后再建立其余模块,在shop_parent的pom.xml添加如下依赖
<!--Spring Boot项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<dependencies>
<!--spring-boot-web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Dubbo 依赖 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
<!--剔除Dubbo内的netty,由于zookeeper中有一个-->
<exclusions>
<exclusion>
<artifactId>netty</artifactId>
<groupId>org.jboss.netty</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--管理商品之间的依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jd.shop</groupId>
<artifactId>shop_api_goods</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.jd.shop</groupId>
<artifactId>shop_api_order</artifactId>
<version>1.0</version>
</dependency>
<!--阿里巴巴的druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.25</version>
</dependency>
<!--spring-boot的mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!--用于打包和启动springBoot应用的插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
复制代码
2、添加项目相关依赖 一、添加springboot项目 二、添加咱们须要用到的服务系统api包 三、添加springboot-web依赖 四、添加链接数据库的相关依赖 五、添加dubbo依赖 六、建立springboot应用的启动类
1.在shop_api_goods(商品系统的api)shop_server_goods(商品系统)这两个模块中不须要继承shop_parent因此在他们的pom.xml中须要修改一下. 2.分别在在shop_server_goods(商品系统和shop_server_order(订单系统)中添加依赖,
<!--shop_server_goods-->
<dependency>
<groupId>com.jd.shop</groupId>
<artifactId>shop_api_goods</artifactId>
</dependency>
复制代码
<!--shop_server_order-->
<dependency>
<groupId>com.jd.shop</groupId>
<artifactId>shop_api_order</artifactId>
</dependency>
复制代码
<!--shop_server_order-->
<!--shop_server_order-->
<dependencies>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--阿里巴巴的druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!--spring-boot的mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<verbose>true</verbose>
<overwrite>false</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
复制代码
建立两个服务端启动类 StartApp shop_server_goods和shop_server_order的启动类
@SpringBootApplication
@EnableTransactionManagement
@MapperScan("com.jd.server.goods.mapper")
public class StartApp {
public static void main(String[] args) {
SpringApplication.run(StartApp.class,args);
}
}
复制代码
一、在application.properties配置文件中添加以下配置信息:(两个服务须要作部分修改,须要修改的地方下面在()里标注了)
server.port=9090(server.port=9091)
#数据库链接地址
spring.datasource.url=jdbc:mysql://localhost:3306/jd_shop
#MySQL驱动
spring.datasource.driverClassName=com.mysql.jdbc.Driver
#数据库帐号
spring.datasource.username=root
#数据库密码
spring.datasource.password=123456
#阿里巴巴Druid链接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#mybatis的mapper.xml配置文件路径
mybatis.mapperLocations=classpath:mapper/*.xml
#mybatis的mapper.xml配置文件domain对象别名扫描路径
mybatis.typeAliasesPackage=com.jd.api.goods.domain
(mybatis.typeAliasesPackage=com.jd.api.order.domain )
复制代码
二、在启动类添加以下注解:(上面的启动类代码已经添加了)
//扫描mybatis接口的注解
@MapperScan("com.jd.server.goods.mapper")
//开启事务管理
@EnableTransactionManagement
复制代码
一、在各个服务系统的pom文件中添加mybatis-generator插件(在pom.xml已经添加) 二、在resources目录下添加generatorConfig.xml文件(两个服务系统须要适当的修改)
一、在application.properties配置文件中添加以下配置信息:
#整合dubbo
#设置应用的服务名
spring.dubbo.application.name=shop-server-goods
(spring.dubbo.application.name=shop-server-order)
#设置RPC协议
spring.dubbo.protocol.name=dubbo
#设置RPC端口号
spring.dubbo.protocol.port=20880
#设置注册中心的地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#设置发布服务注解扫描的路径
spring.dubbo.scan=com.jd.server.goods.service.impl
(spring.dubbo.scan=com.jd.server.order.service.impl)
复制代码
一、使用mybatis-genenrator插件生成domain类、mapper接口、mapper.xml文件 二、每一个domain类应该在对应的api项目中 三、在对应的api项目中建立一个服务接口
四、建立服务实现类 在该实现类上贴上@Service注解,贴上了该注解就表明了该类须要发布服务
注意: 一、该注解是com.alibaba.dubbo.config.annotation包下的注解不是spring的注解 二、贴上该注解的服务实现类必需要在上面的配置项spring.dubbo.scan=xxx可以扫描到的路径下
一、在application.properties配置文件中添加以下配置信息:
#dubbo应用名
spring.dubbo.application.name=shop-client-mgrsite
#链接的注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#引用服务扫描的路径
spring.dubbo.scan=com.jd.client.mgrsite.controller
复制代码
一、建立商品的controller调用商品的服务 在该controller须要注入服务的依赖上贴上@Refrence注解,贴上该注解就能够自动的把须要引用的服务注入进来 注意:贴上该注解的服务依赖必需要在上面的配置项spring.dubbo.scan=xxx可以扫描到的路径下
@Controller
public class ProductController {
@Reference
IProductService productService;
@RequestMapping("/getAllProduct")
@ResponseBody
public List<Product> getAllProduct() {
return productService.getAllProduct();
}
}
复制代码