一、分布式系统中的相关概念

1.大型互联网项目架构目标

1)互联网项目特点:

用户多、流量大,并发高、海量数据、易受攻击、功能繁琐、变更快

2)目标

高性能:提供快速的访问体验。

高可用:网站服务一直可以正常访问。

可伸缩:通过硬件增加/减少,提高/降低处理能力。

高可扩展:系统间耦合低,方便的通过新增 /移除方式,增加/减少新的功能/模块。

安全性:提供网站安全访问和数据加密,安全存储等策略。

敏捷性:随需应变,快速响应。

3)衡量网站的性能指标:

响应时间:指执行一个请求从开始到最后收到响应数据所花费的总体时间。

并发数:指系统同时能处理的请求数量。

并发连接数:指的是客户端向服务器发起请求,并建立了TCP连接。每秒钟服务器连接的总TCP数量

请求数:也称为QPS(Query Per Second) 指每秒多少请求。请求数大于等于连接数

并发用户数:单位时间内有多少用户

吞吐量:指单位时间内系统能处理的请求数量。

QPS:Query Per Second 每秒查询数。

TPS:Transactions Per Second 每秒事务数。

一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

一个页面的一次访问,只会形成一个TPS;但一次页面请求,可能产生多次对服务器的请求,就会有多个QPS         QPS >= 并发连接数 >= TPS

2.集群和分布式

集群:很多“人”一起 ,干一样的事。

一个业务模块,部署在多台服务器上。

分布式:很多“人”一起,干不一样的事。这些不一样的事,合起来是一件大事。

一个大的业务系统,拆分为小的业务模块,分别部署在不同的机器上。

3.架构演进

Dubbo 是 SOA时代的产物,SpringCloud 是微服务时代的产物

二、Dubbo 概述

1.概念

Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。

致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。

官网:http://dubbo.apache.org

2.架构

三、Dubbo 快速入门

1.Zookeeper安装

2.Dubbo快速入门

dubbo包括dubbo-service(service层,提供者)和dubbo-web(controller层,消费者) 


dubbo-web

<!-- pom.xml --><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>dubbo-web</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><spring.version>5.1.9.RELEASE</spring.version><dubbo.version>2.7.4.1</dubbo.version><zookeeper.version>4.0.0</zookeeper.version></properties><dependencies><!-- servlet3.0规范的坐标 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--spring的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--springmvc的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${zookeeper.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${zookeeper.version}</version></dependency><!--在spring和spring mvc中是需要依赖service模块的,但是分布式就可以不用依赖了,注释掉,此时UserController就会报错--><!--依赖service模块,对应的是dubbo-web\src\main\webapp\WEB-INF\web.xml--><!--<dependency><groupId>com.itheima</groupId><artifactId>dubbo-service</artifactId><version>1.0-SNAPSHOT</version></dependency>--></dependencies><build><plugins><!--service不需要启动tomcat--><!--tomcat插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8000</port><path>/</path></configuration></plugin></plugins></build></project><!--——————————————————————————————————————————————————————————————————————————————-->
<!--由于是web项目,所以要有webapp      dubbo-web\src\main\webapp\WEB-INF\web.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><!-- 在分布式中spring配置文件的加载需要注释掉,只留下springmvc --> <!-- spring --><context-param><param-name>contextConfigLocation</param-name><!--在dubbo-web\pom.xml中添加依赖--><param-value>classpath*:spring/applicationContext*.xml</param-value><!--spring配置文件--></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class><!--核心监听器--></listener><!-- Springmvc -->     <servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载--><init-param><param-name>contextConfigLocation</param-name><!--依赖放在dubbo-web\src\main\resources--><param-value>classpath:spring/springmvc.xml</param-value><!--spring mvc配置文件--></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping></web-app><!--——————————————————————————————————————————————————————————————————————————————-->
<!--dubbo-web\src\main\resources\spring\springmvc.xml--><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--分布式时这个包留着,这个包扫描springmvc  controller-UserController中的注解--><mvc:annotation-driven/><context:component-scan base-package="com.itheima.controller"/><!--dubbo的配置--><!--1.配置项目的名称,唯一--><dubbo:application name="dubbo-web" ><!--因为在自己写代码的时候,web和service在一个服务器中,所以会产生报错ERROR org.apache.dubbo.qos.server.ServerAddress already in use : bind,端口被占用,但实际开发中是会部署到两个服务器中的,所以这里加了端口号--><dubbo:parameter key="qos.port" value="33333"/></dubbo:application><!--2.配置注册中心的地址--><dubbo:registry address="zookeeper://192.168.149.135:2181"/><!--3.配置dubbo包扫描--><dubbo:annotation package="com.itheima.controller" /></beans>
#dubbo-web\src\main\resources\log4j.properties# DEBUG < INFO < WARN < ERROR < FATAL
# Global logging configuration
log4j.rootLogger=info, stdout,file
# My logging configuration...
#log4j.logger.com.tocersoft.school=DEBUG
#log4j.logger.net.sf.hibernate.cache=debug
## Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%nlog4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=../logs/iask.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %l  %m%n
//dubbo-web\src\main\java\com\itheima\controller\UserController.javapackage com.itheima.controller;import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;//分布式导入的包
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {/*//注入Service@Autowired//本地注入private UserService userService;*//*分布式,远程注入的功能1. 从zookeeper注册中心获取userService的访问url(自动)从zookeeper中获取,需要告诉路径,将配置在这中dubbo-web\src\main\resources\spring\springmvc.xml2. 进行远程调用RPC(自动)3. 将结果封装为一个代理对象。给变量赋值*/@Reference//远程注入private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}/*因为service项目是被依赖的,所以需要先dubbo-service右键安装(maven中的install),然后再启动dubbo-web(右键maven中的tomcat7:run)*/}

dubbo-service

<!--dubbo-service/pom.xml--><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>dubbo-service</artifactId><version>1.0-SNAPSHOT</version><!-- 分布式的话需要加上war(因为需要每个部分都成单独的模块),并且要在后面导入tomca包 --><packaging>war</packaging><properties><spring.version>5.1.9.RELEASE</spring.version><dubbo.version>2.7.4.1</dubbo.version><zookeeper.version>4.0.0</zookeeper.version></properties><dependencies><!-- servlet3.0规范的坐标 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--spring的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--springmvc的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${zookeeper.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${zookeeper.version}</version></dependency></dependencies><!--分布式的话需要加上 --><build><plugins><!--tomcat插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>9000</port><path>/</path></configuration></plugin></plugins></build></project><!--——————————————————————————————————————————————————————————————————————————————-->
<!--dubbo-service/src/main/resources/spring/applicationContext.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--包扫描--><context:component-scan base-package="com.itheima.service" /><!-- 分布式配置,把上面的spring的包扫描可以注掉,分布式用的dubbo的包扫描--><!--dubbo的配置--><!--1.配置项目的名称,唯一--><dubbo:application name="dubbo-service"/><!--2.配置注册中心的地址--><dubbo:registry address="zookeeper://192.168.149.135:2181"/><!--3.配置dubbo包扫描--><dubbo:annotation package="com.itheima.service.impl" /></beans><!-- xmlns:dubbo="http://dubbo.apache.org/schema/dubbo 为dubbo的引入信息-->
#dubbo-service/src/main/resources/log4j.properties# DEBUG < INFO < WARN < ERROR < FATAL
# Global logging configuration
log4j.rootLogger=info, stdout,file
# My logging configuration...
#log4j.logger.com.tocersoft.school=DEBUG
#log4j.logger.net.sf.hibernate.cache=debug
## Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%nlog4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=../logs/iask.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %l  %m%n
//dubbo-service/src/main/java/com/itheima/service/UserService.java
package com.itheima.service;public interface UserService {public String sayHello();
}//——————————————————————————————————————————————————————————————————————————————————
//dubbo-service/src/main/java/com/itheima/service/impl/UserServiceImpl.java
package com.itheima.service.impl;import com.itheima.service.UserService;
import org.springframework.stereotype.Service;@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义
public class UserServiceImpl implements UserService {public String sayHello() {return "hello dubbo!~";}
}//- - - - - - - - - - 分布式写法 - - - - - - - - - - - - - - - - - - - - - - - - -
// 需要把这个类提供的服务对外发布出去,ip端口和访问路径告诉dubbo,然后dubbo进入到Zookeeper中//这里的service导入的和上面的是不同的
package com.itheima.service.impl;import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;@Service//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
public class UserServiceImpl implements UserService {public String sayHello() {return "hello dubbo hello!~";}
}
<!-- ------------------------------------------------------------------------ --><!-- dubbo-service/src/main/webapp/WEB-INF/web.xml -->
<!-- 在分布式中,需要把webapp加入到dubbo-service中,同时因为springmvc没有用了,就可以去掉了 -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><!-- spring --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/applicationContext*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener></web-app>
//接口都放在一起,所以新建一个interface用来放接口,然后用service和web依赖这个接口
//dubbo-interface/src/main/java/com/itheima/service/UserService.javapackage com.itheima.service;public interface UserService {public String sayHello();
}//把这个接口复制过来之后就可以把dubbo-service和dubbo-web 里面的service删除掉了然后再dubbo-service和dubbo-web的pom.xml文件中分别加上对这个接口的依赖/*  <!--依赖公共的接口模块--><dependency><groupId>com.itheima</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version></dependency>
*///在启动的时候,因为interface是被依赖的模块,所以先右键Run maven-install进行安装
//安装完成之后分别启动service和web,右键Run maven-tomcat7:run

四、Dubbo 高级特性

1.dubbo-admin管理平台

2.序列化

 

dubbo-service

<!-- dubbo-pro/dubbo-service/src/main/resources/spring/applicationContext.xml --><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--<context:component-scan base-package="com.itheima.service" />--><!--在启动读dubbo-service服务的时候不仅要用tomcat占用9000这个端口,而且dubbo内部也会占用本机的这个端口,默认情况下是20880,也可以修改后面做负载均衡的时候要有一定的改动--><!--<dubbo:protocol port="20880" />--><!--dubbo的配置--><!--1.配置项目的名称,唯一--><dubbo:application name="dubbo-service"/><!--2.配置注册中心的地址,这个讲解时虚拟机中的IP地址,自己写的时候要进行调整--><dubbo:registry address="zookeeper://192.168.149.135:2181"/><!--3.配置dubbo包扫描--><dubbo:annotation package="com.itheima.service.impl" /><!-- 元数据配置 --><dubbo:metadata-report address="zookeeper://192.168.149.135:2181" />
</beans>
<!-- /dubbo-pro/dubbo-service/pom.xml --><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>dubbo-service</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><spring.version>5.1.9.RELEASE</spring.version><dubbo.version>2.7.4.1</dubbo.version><zookeeper.version>4.0.0</zookeeper.version></properties><dependencies><!-- servlet3.0规范的坐标 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--spring的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--springmvc的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${zookeeper.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${zookeeper.version}</version></dependency><!--依赖公共的接口模块--><dependency><groupId>com.itheima</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies><build><plugins><!--tomcat插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>9000</port><path>/</path></configuration></plugin></plugins></build>
</project>
//写完interface中的接口,再在这里面添加方法//   /dubbo-pro/dubbo-service/src/main/java/com/itheima/service/impl/UserServiceImpl.java
package com.itheima.service.impl;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;//@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义@Service//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
public class UserServiceImpl implements UserService {public String sayHello() {return "hello dubbo hello!~";}public User findUserById(int id) {//查询User对象,正常应该查数据库实现User user = new User(1,"zhangsan","123");return user;}
}
#/dubbo-pro/dubbo-service/src/main/resources/log4j.properties# DEBUG < INFO < WARN < ERROR < FATAL
# Global logging configuration
log4j.rootLogger=info, stdout,file
# My logging configuration...
#log4j.logger.com.tocersoft.school=DEBUG
#log4j.logger.net.sf.hibernate.cache=debug
## Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%nlog4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=../logs/iask.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %l  %m%n
<!-- /dubbo-pro/dubbo-service/src/main/webapp/WEB-INF/web.xml --><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><!-- spring --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/applicationContext*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener></web-app>

dubbo-pojo

//interface依赖pojo,web和service依赖interface,所以web和service间接依赖了pojo//   /dubbo-pro/dubbo-pojo/src/main/java/com/itheima/pojo\User.javapackage com.itheima.pojo;import java.io.Serializable;/*** 注意!!!*  将来所有的pojo类都需要实现Serializable接口*  数据要在两个服务器上通过流进行传播*/
public class User implements Serializable {private int id;private String username;private String password;//方便构造对象,所以这个位置加上了public User() {}public User(int id, String username, String password) {this.id = id;this.username = username;this.password = password;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
<!-- /dubbo-pro/dubbo-pojo/pom.xml --><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>dubbo-pojo</artifactId><version>1.0-SNAPSHOT</version></project>

dubbo-interface

//  /dubbo-pro/dubbo-interface/src/main/java/com/itheima/service/UserService.java
package com.itheima.service;import com.itheima.pojo.User;public interface UserService {public String sayHello();//这个位置只是一个接口的声明,具体的实现是在service中实现的//查询用户public User findUserById(int id);}
<!-- /dubbo-pro/dubbo-interface/pom.xml --><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- 添加一下对pojo的依赖 --><dependency><groupId>com.itheima</groupId><artifactId>dubbo-pojo</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

dubbo-web

//  /dubbo-pro/dubbo-web/src/main/java/com/itheima/controller/UserController.javapackage com.itheima.controller;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {//注入Service//@Autowired//本地注入/*1. 从zookeeper注册中心获取userService的访问url2. 进行远程调用RPC3. 将结果封装为一个代理对象。给变量赋值*/@Reference//远程注入private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}/*** 根据id查询用户信息* @param id* @return*/@RequestMapping("/find")public User find(int id){return userService.findUserById(id);}}
<!--  /dubbo-pro/dubbo-web/src/main/resources/spring/springmvc.xml  -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><mvc:annotation-driven/><context:component-scan base-package="com.itheima.controller"/><!--dubbo的配置--><!--1.配置项目的名称,唯一--><dubbo:application name="dubbo-web" ><dubbo:parameter key="qos.port" value="33333"/></dubbo:application><!--2.配置注册中心的地址--><dubbo:registry address="zookeeper://192.168.149.135:2181"/><!--3.配置dubbo包扫描--><dubbo:annotation package="com.itheima.controller" /></beans><!-- —————————————————————————————————————————————————————————————————————————— -->
<!-- /dubbo-pro/dubbo-web/src/main/webapp/WEB-INF/web.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><!-- Springmvc -->  <servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping></web-app><!-- —————————————————————————————————————————————————————————————————————————— --><!-- /dubbo-pro/dubbo-web/pom.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>dubbo-web</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><spring.version>5.1.9.RELEASE</spring.version><dubbo.version>2.7.4.1</dubbo.version><zookeeper.version>4.0.0</zookeeper.version></properties><dependencies><!-- servlet3.0规范的坐标 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--spring的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--springmvc的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${zookeeper.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${zookeeper.version}</version></dependency><!--依赖公共的接口模块--><dependency><groupId>com.itheima</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version></dependency><!--依赖service模块--><!-- <dependency><groupId>com.itheima</groupId><artifactId>dubbo-service</artifactId><version>1.0-SNAPSHOT</version></dependency>--></dependencies><build><plugins><!--tomcat插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8000</port><path>/</path></configuration></plugin></plugins></build></project><!-- —————————————————————————————————————————————————————————————————————————— -->
<!-- /dubbo-pro/dubbo-web/src/main/resources/log4j.properties -->
# DEBUG < INFO < WARN < ERROR < FATAL
# Global logging configuration
log4j.rootLogger=info, stdout,file
# My logging configuration...
#log4j.logger.com.tocersoft.school=DEBUG
#log4j.logger.net.sf.hibernate.cache=debug
## Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%nlog4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=../logs/iask.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %l  %m%n

3.地址缓存

4.超时与重试

//dubbo-pro/dubbo-service/src/main/java/com/itheima/service/impl/UserServiceImpl.javapackage com.itheima.service.impl;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;//@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义
//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
@Service(timeout = 3000,retries = 0)//默认是1秒
//@Service(timeout = 3000,retries = 2)当前服务3秒超时,重试2次,一共3次,重试默认是两次
public class UserServiceImpl implements UserService {int i = 1;public String sayHello() {return "hello dubbo hello!~";}public User findUserById(int id) {System.out.println("服务被调用了:"+i++);//查询User对象User user = new User(1,"zhangsan","123");//数据库查询很慢,查了5秒try { //模拟一下Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}return user;}
}/*——————————————————————————————————————————————————————————————————————————————————*/
// dubbo-pro/dubbo-web/src/main/java/com/itheima/controller/UserController.java
package com.itheima.controller;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {//注入Service//@Autowired//本地注入/*1. 从zookeeper注册中心获取userService的访问url2. 进行远程调用RPC3. 将结果封装为一个代理对象。给变量赋值*///这个位置也可以配置超时,如果,在这(调用方,服务消费方)配置1秒超时,但是在@Service(timeout = 3000,retries = 0)(提供方,服务生产方)配置3秒超时,1秒是生效的,建议在提供方配置,(定义服务一般知道消耗的时间情况)@Reference(timeout = 1000)//远程注入private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}/*** 根据id查询用户信息* @param id* @return*/int i = 1;@RequestMapping("/find")public User find(int id){new Thread(new Runnable() {public void run() {while (true){System.out.println(i++);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();return userService.findUserById(id);}}//模拟的时候可能会四秒的时候才报错,因为是两个线程,不是那么精准

5.多版本

//最开始service只有一个实现类,说明只有一个版本
/*————————————————————————————————————————————————————————————————————————————————————*/
//  /dubbo-pro/dubbo-service/src/main/java/com/itheima/service/impl/UserServiceImpl.java
package com.itheima.service.impl;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;//@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义
//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
@Service(version = "v1.0")
public class UserServiceImpl implements UserService {public String sayHello() {return "hello dubbo hello!~";}public User findUserById(int id) {System.out.println("old...");//查询User对象User user = new User(1,"zhangsan","123");return user;}
}/*————————————————————————————————————————————————————————————————————————————————————*/
// /dubbo-pro/dubbo-service/src/main/java/com/itheima/service/impl/UserServiceImpl2.java
package com.itheima.service.impl;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;//@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义
//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
@Service(version = "v2.0")
public class UserServiceImpl2 implements UserService {public String sayHello() {return "hello dubbo hello!~";}public User findUserById(int id) {System.out.println("new....");//查询User对象User user = new User(1,"zhangsan","123");return user;}
}
// /dubbo-pro/dubbo-web/src/main/java/com/itheima/controller/UserController.java
package com.itheima.controller;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {//注入Service//@Autowired//本地注入/*1. 从zookeeper注册中心获取userService的访问url2. 进行远程调用RPC3. 将结果封装为一个代理对象。给变量赋值*///@Reference(version = "v1.0")//远程注入@Reference(version = "v2.0")//远程注入private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}/*** 根据id查询用户信息* @param id* @return*/@RequestMapping("/find")public User find(int id){return userService.findUserById(id);}}

6.负载均衡

// /dubbo-pro/dubbo-service/src/main/java/com/itheima/service/impl/UserServiceImpl.java
package com.itheima.service.impl;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;//@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义
//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
@Service(weight = 100)
//@Service(weight = 200)
//@Service(weight = 300)
public class UserServiceImpl implements UserService {public String sayHello() {return "1......";}/*public String sayHello() {return "2......";}*//*public String sayHello() {return "3......";}*/public User findUserById(int id) {System.out.println("old...");//查询User对象User user = new User(1,"zhangsan","123");return user;}
}
<!-- /dubbo-pro/dubbo-service/src/main/resources/spring/applicationContext.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--<context:component-scan base-package="com.itheima.service" />--><dubbo:protocol port="20880" /><!--<dubbo:protocol port="20882" />--><!--<dubbo:protocol port="20883" />--><!--dubbo的配置--><!--1.配置项目的名称,唯一--><dubbo:application name="dubbo-service"><!--默认为五个2,可以不写<dubbo:parameter key="qos.port" value="22222"/>--><!--<dubbo:parameter key="qos.port" value="44444"/>--><!--<dubbo:parameter key="qos.port" value="55555"/>--></dubbo:application><!--2.配置注册中心的地址--><dubbo:registry address="zookeeper://192.168.149.135:2181"/><!--3.配置dubbo包扫描--><dubbo:annotation package="com.itheima.service.impl" /><!-- —————————————————————————————————————————————————————————————————————————— -->
<!-- /dubbo-pro/dubbo-service/pom.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>dubbo-service</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><spring.version>5.1.9.RELEASE</spring.version><dubbo.version>2.7.4.1</dubbo.version><zookeeper.version>4.0.0</zookeeper.version></properties><dependencies><!-- servlet3.0规范的坐标 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--spring的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--springmvc的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${zookeeper.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${zookeeper.version}</version></dependency><!--依赖公共的接口模块--><dependency><groupId>com.itheima</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies><build><plugins><!--tomcat插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>9000</port><!--<port>9002</port>--><!-- <port>9003</port>--><path>/</path></configuration></plugin></plugins></build>
</project><!-- 元数据配置 --><dubbo:metadata-report address="zookeeper://192.168.149.135:2181" />
</beans><!-- 然后再dubbo-service上右键maven-tomcat7:run重新启动一下,不要点击上方的红色暂停按钮-->
// /dubbo-pro/dubbo-web/src/main/java/com/itheima/controller/UserController.java
package com.itheima.controller;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {//注入Service//@Autowired//本地注入/*1. 从zookeeper注册中心获取userService的访问url2. 进行远程调用RPC3. 将结果封装为一个代理对象。给变量赋值*///改完之后再重启一下web//负载均衡,一共有四种策略,random是其中一种@Reference(loadbalance = "random")//远程注入private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}/*** 根据id查询用户信息* @param id* @return*/@RequestMapping("/find")public User find(int id){return userService.findUserById(id);}}

7.集群容错

//每个机器配置完都要重启一下那个模块service// /dubbo-pro/dubbo-service/src/main/java/com/itheima/service/impl/UserServiceImpl.java
package com.itheima.service.impl;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;//@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义
//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
@Service
public class UserServiceImpl implements UserService {public String sayHello() {return "hello dubbo hello!~";}public User findUserById(int id) {//第一个机器System.out.println("1...");//查询User对象User user = new User(1,"zhangsan","123");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}/*//第二个机器System.out.println("2...");//查询User对象User user = new User(1,"zhangsan","123");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}*//*//第三个机器System.out.println("3...");//查询User对象User user = new User(1,"zhangsan","123");*/return user;}
}
<!-- /dubbo-pro/dubbo-service/src/main/resources/spring/applicationContext.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--<context:component-scan base-package="com.itheima.service" />--><dubbo:protocol port="20881" /><!--第二个机器<dubbo:protocol port="20882" />--><!--第三个机器<dubbo:protocol port="20883" />--><!--dubbo的配置--><!--1.配置项目的名称,唯一--><dubbo:application name="dubbo-service"><dubbo:parameter key="qos.port" value="22222"/><!--第二个机器<dubbo:parameter key="qos.port" value="44444"/>--><!--第三个机器<dubbo:parameter key="qos.port" value="55555"/>--></dubbo:application><!--2.配置注册中心的地址--><dubbo:registry address="zookeeper://192.168.149.135:2181"/><!--3.配置dubbo包扫描--><dubbo:annotation package="com.itheima.service.impl" /><!-- 元数据配置 --><dubbo:metadata-report address="zookeeper://192.168.149.135:2181" />
</beans><!-- ——————————————————————————————————————————————————————————————————————————————— -->
<!-- /dubbo-pro/dubbo-service/pom.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>dubbo-service</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><spring.version>5.1.9.RELEASE</spring.version><dubbo.version>2.7.4.1</dubbo.version><zookeeper.version>4.0.0</zookeeper.version></properties><dependencies><!-- servlet3.0规范的坐标 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--spring的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--springmvc的坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${zookeeper.version}</version></dependency><!--ZooKeeper客户端实现 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${zookeeper.version}</version></dependency><!--依赖公共的接口模块--><dependency><groupId>com.itheima</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies><build><plugins><!--tomcat插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><!--第一个机器--><port>9000</port><!--第二个机器<port>9002</port>--><!--第三个机器<port>9003</port>--><path>/</path></configuration></plugin></plugins></build>
</project>
//  /dubbo-pro/dubbo-web/src/main/java/com/itheima/controller/UserController.java
package com.itheima.controller;import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {//注入Service//@Autowired//本地注入/*1. 从zookeeper注册中心获取userService的访问url2. 进行远程调用RPC3. 将结果封装为一个代理对象。给变量赋值*///集群策略,默认不配置也是failover@Reference(cluster = "failover")//远程注入private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}/*** 根据id查询用户信息* @param id* @return*/@RequestMapping("/find")public User find(int id){return userService.findUserById(id);}}//写完之后web再重启一下

8.服务降级

// /dubbo-pro/dubbo-web/src/main/java/com/itheima/controller/UserController.java
//远程注入
@Reference(mock = "force:return null")//不再去调用userservice的服务,控制台不会打印输出
//@Reference(mock = "fail:return null")失败之后返回null,但是不会报错
private UserService userService;

分布式开发框架Dubbo相关推荐

  1. 61-Java-分布式开发框架Dubbo

    61-Java-分布式开发框架Dubbo-- 笔记 笔记内容来源与黑马程序员教学视频 文章目录 61-Java-分布式开发框架Dubbo-- 笔记 分布式开发框架Dubbo 笔记中涉及资源: 一.分布 ...

  2. NutzWk 5.2.0 重磅发布,Java 微服务分布式开发框架

    NutzWk 5.2.0 更新内容: 运维中心重磅功能完成,可在线上传jar包.编辑配置文件.关闭实例进程.启动新实例进程.动态修改日志等级.查看服务器资源占用情况等,支持分布式部署: 文件上传由本地 ...

  3. 阿里java架构师面试128题含答案:分布式架构+Dubbo+多线程+Redis

    一.Java基础和高级 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. 3.反射中,Class.forName和classloader的区别 4.sessio ...

  4. 搭建分布式环境:Dubbo+Zookeeper

    QUESTION:搭建分布式环境:Dubbo+Zookeeper? ANSWER: 一:官网下载Zookeeper 点击官网:Zookeeper,进行下载. 下载完成,解压缩到文件. 二:配置启动Zo ...

  5. 分布式面试 - dubbo 的 spi 思想是什么?

    分布式面试 - dubbo 的 spi 思想是什么? 面试题 dubbo 的 spi 思想是什么? 面试官心理分析 继续深入问呗,前面一些基础性的东西问完了,确定你应该都 ok,了解 dubbo 的一 ...

  6. springboot分布式(zookeeper+Dubbo)

    文章目录 springBoot 分布式zookeeper+Dubbo 一.基础知识 单一应用架构 垂直应用架构 分布式架构 流动计算架构 什么是RPC? 二.Dubbo 什么是Dubbo 为什么使用D ...

  7. spring分布式开发框架

    spring分布式开发框架 分布式开发就是将spring项目的dao层,service层,controller层以及entity层分别建立在不同的项目下. 步骤 新建一个maven项目,不使用模板,取 ...

  8. NutzWk 5.2.4 发布,Java 微服务分布式开发框架

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   NutzWk 5.2.4 更新内容: 修复Vue版管理后台,启用/禁用用户时会清空用户表的bug,受影响版本5.2.3/5.2.2/5.2. ...

  9. (十三) 构建dubbo分布式平台-dubbo管控台安装

    上一篇我们介绍<构建dubbo分布式平台-zookeeper注册中心的安装>,今天我们来学习-dubbo管控台安装. Dubbo管理控制台的安装 1.Dubbo管理控制台的主要作用:服务治 ...

最新文章

  1. android EditText 限定中文个数与英文个数的解决方式
  2. 自动驾驶中的3D物体状态检测
  3. JAVA基础4-循环语句
  4. 2010 ACM/ICPC Online-Contest-SCU[四川赛区网络预选赛]
  5. nfcwriter写入_NFCWriterX 详细使用教程 iOS iPhone NFC实战教程 更新支持iOS11
  6. 数据库设计:pd工程创建数据库表
  7. java上传csv文件上传_java处理csv文件上传示例详解
  8. mysql安装 demo [linux centos7] [5.7.26]
  9. RAC RMAN备份
  10. windows清除记住的密码
  11. 没想到你是这样的EasyRecovery
  12. 「JXOI2018」游戏
  13. 基于Java的简单WebAPI接口调用(中国气象数据网接口调用示例)
  14. Java工程师工作描述写作要点该怎么写?
  15. 访问FTP站点下载文件,提示“当前的安全设置不允许从该位置下载文件”
  16. USB 的UVC协议分析
  17. java 将pdf文件转成高清图片(多张合并成一张)
  18. PHP 正则表达式preg_match
  19. 在Excel中给不足位数的数字前面补0
  20. 万字干货 | IBO的金融原理和应用方向分析

热门文章

  1. ERA5 积雪 降雪 区别_漠河降雪量已达入秋最大级别 本轮降雪将持续到28日白天...
  2. 卷积神经网络CNN里经典网络模型之 AlexNet全网最详解(理论篇)
  3. shellcode绕过kav6
  4. .net ajax 服务器,以服务器端为中心的 ASP.NET AJAX 模式(2)-陈广琛 | Microsoft Docs
  5. 使用WIFI连接手机adb
  6. 【PB】PB画板介绍
  7. 软件工程SWEBOK所包含的10个领域以及每个领域所做的事情
  8. 高并发架构解决的几个研究方向
  9. Pulsar Multi Tenancy 多租户
  10. PAT 秀恩爱分的快