dubbo學習筆記二--與spring boot整合

一,高可用


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;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章