一,高可用
1,zookeeper宕機
現象:
zookeeper註冊中心宕機,還可以消費dubbo暴露的服務。
註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地緩存通訊。
2,集羣下dubbo負載均衡配置
3,服務降級
4,集羣容錯
整合hystrix
二,原理
1,服務消費方(client)以本地方式調用服務
2,client agent接收到調用後,將方法、參數等組裝成能夠進行網絡傳輸的消息體。
3,client agent找到服務地址,並將消息發送到服務端。
4,server agent收到消息後進行解碼。
5,server agent根據解碼結果調用本地的服務。
6,本地服務執行並將結果返回給server agent。
7,server agent將返回結果打包成消息併發送到消費方。
8,client agent接收到消息,並進行解碼。
9,服務消費方得到最終結果。
RPC框架的目標就是把2--8這些步驟都封裝起來。
dubbo是基於netty(NIO)進行通信的。
三,服務提供方
1,pom.xml
<!-- 父級依賴 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!-- 使用springmvc和spring的jar包 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.yu.taobao</groupId>
<artifactId>taobao-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
2,application.properties
server.port=8096
dubbo.application.name=boot-user-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20882
dubbo.monitor.protocol=registry
3,ApplicationController
/*
* springboot與dubbo整合
*1): 導入引用
* 1,導入dubbo-starter,在application.properties中配置屬性,
* 使用@Service暴露服務,使用@Reference應用服務
* @EnableDubbo
* 2,導入其它引用
* 2):
* 保留dubbo xml配置,去掉application.properties中配置
* 使用@ImportResource(locations="classpath:provider.xml")
* 暴露服務不用@Service
* 3):
* 使用註解API
*/
@EnableDubbo //開啓基於註解的dubbo功能
@EnableHystrix //開啓服務容錯
@EnableAsync //開啓異步調用
@SpringBootApplication(scanBasePackages= {"com.taobao.*"},
exclude= {RedisAutoConfiguration.class})
public class ApplicationController {
//入口
public static void main(String[] args) {
SpringApplication.run(ApplicationController.class, args);
}
}
4,UserServiceImpl
/*
*1,將服務提供者註冊到註冊中心
* a,導入dubbo,zookeeper依賴
* b,配置服務提供者
*2,讓服務消費者去註冊中心訂閱服務提供者的服務地址
*
*/
@Service //暴露服務
@Component
public class UserServiceImpl implements UserService {
@HystrixCommand
public List<UserAddress> getUserAddressList(String userId) {
System.out.println("3號");
UserAddress userAddress1=new UserAddress(1, "合肥", "1", "李四", "123654789", "Y");
UserAddress userAddress2=new UserAddress(2, "淮北", "1", "張三", "231133333", "N");
if(Math.random()>0.5) {
throw new RuntimeException();
}
return Arrays.asList(userAddress1,userAddress2);
}
}
四,服務消費者
1,pom.xml
<!-- 父級依賴 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!-- 使用springmvc和spring的jar包 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.yu.taobao</groupId>
<artifactId>taobao-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
2,application.properties
server.port=8092
dubbo.application.name=boot-user-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.monitor.protocol=registry
3,ApplicationController
@EnableDubbo
@SpringBootApplication(scanBasePackages= {"com.taobao.*"},
exclude= {RedisAutoConfiguration.class})
@EnableHystrix
@EnableAsync //開啓異步調用
public class ApplicationController {
//入口
public static void main(String[] args) {
SpringApplication.run(ApplicationController.class, args);
}
}
4,OrderServiceImpl
@Service
public class OrderServiceImpl implements OrderService {
//@Reference(url="127.0.0.1:20880") //沒有註冊中心時,與dubbo直連
@Reference
UserService userService;
@HystrixCommand(fallbackMethod="error")
public List<UserAddress> initOrder(String userId) {
List<UserAddress> addressList = userService.getUserAddressList(userId);
for (UserAddress userAddress : addressList) {
System.out.println(userAddress.getUserAddress());
}
return addressList;
}
public List<UserAddress> error(String userId) {
return null;
}
}
5,UserController
@Controller
public class UserController {
@Autowired
private OrderService orderService;
@ResponseBody
@RequestMapping("initorder")
public List<UserAddress> initOrder(String userId) {
List<UserAddress> order = orderService.initOrder(userId);
return order;
}
}