SpringBoot整合Dubbo与豪猪断路器,必须了解什么是服务降级?
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
工程目录
创建maven的坐标
<?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"> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.0.4.RELEASEversion> <relativePath /> parent> <modelVersion>4.0.0modelVersion> <artifactId>springboot-dubbo-service-providerartifactId> <packaging>jarpackaging> <name>boot-user-service-providername> <description>Demo project for Spring Bootdescription> <properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding> <java.version>1.8java.version> properties> <dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starterartifactId> dependency> <dependency> <groupId>com.examplegroupId> <artifactId>iterface-commonartifactId> <version>1.0-SNAPSHOTversion> dependency> <dependency> <groupId>com.alibaba.bootgroupId> <artifactId>dubbo-spring-boot-starterartifactId> <version>0.2.0version> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId> spring-cloud-starter-netflix-hystrix artifactId> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> plugins> build> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-dependenciesartifactId> <version>Finchley.SR1version> <type>pomtype> <scope>importscope> dependency> dependencies> dependencyManagement>project>
添加配置文件
application.yml
#dubbo.application.name=user-service-provider#dubbo.registry.address=127.0.0.1:2181#dubbo.registry.protocol=zookeeper##dubbo.protocol.name=dubbo##dubbo.protocol.port=20881##dubbo.monitor.protocol=registry##dubbo.scan.base-packages=com.atguigu.gmall
dubbo.properties
dubbo.protocol.port=20882
provider.xml
xml version="1.0" encoding="UTF-8"?>xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="springboot-dubbo-service-provider">dubbo:application> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181">dubbo:registry> <dubbo:protocol name="dubbo" port="20882">dubbo:protocol> <dubbo:service interface="com.dubbo.common.service.UserService" ref="userServiceImpl01" timeout="1000" version="1.0.0"> <dubbo:method name="getUserAddressList" timeout="1000">dubbo:method> dubbo:service> <dubbo:provider timeout="1000">dubbo:provider> id="userServiceImpl01" class="com.yang.dubbo.service.impl.UserServiceImpl"> <dubbo:monitor protocol="registry">dubbo:monitor>
创建配置类
package com.yang.dubbo.config;import java.util.ArrayList;import java.util.List;import com.dubbo.common.service.UserService;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.alibaba.dubbo.config.ApplicationConfig;import com.alibaba.dubbo.config.MethodConfig;import com.alibaba.dubbo.config.MonitorConfig;import com.alibaba.dubbo.config.ProtocolConfig;import com.alibaba.dubbo.config.ProviderConfig;import com.alibaba.dubbo.config.RegistryConfig;import com.alibaba.dubbo.config.ServiceConfig;@Configurationpublic class MyDubboConfig {@Bean public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("springboot-dubbo-service-provider"); return applicationConfig; }// @Bean public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("127.0.0.1:2181"); return registryConfig; }// @Bean public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName("dubbo"); protocolConfig.setPort(20882); return protocolConfig; }/** * ref="userServiceImpl01" timeout="1000" version="1.0.0"> */ @Bean public ServiceConfiguserServiceConfig(UserService userService){
ServiceConfig serviceConfig = new ServiceConfig<>(); serviceConfig.setInterface(UserService.class); serviceConfig.setRef(userService); serviceConfig.setVersion("1.0.0"); //配置每一个method的信息 MethodConfig methodConfig = new MethodConfig(); methodConfig.setName("getUserAddressList"); methodConfig.setTimeout(1000); //将method的设置关联到service配置中 List methods = new ArrayList<>(); methods.add(methodConfig); serviceConfig.setMethods(methods); //ProviderConfig //MonitorConfig return serviceConfig; }
}
service层
package com.yang.dubbo.service.impl;import java.util.Arrays;import java.util.List;import com.dubbo.common.bean.UserAddress;import com.dubbo.common.service.UserService;import org.springframework.stereotype.Component;import com.alibaba.dubbo.config.annotation.Reference;import com.alibaba.dubbo.config.annotation.Service;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;@Service//暴露服务 @Componentpublic class UserServiceImpl implements UserService {@HystrixCommand @Override public ListgetUserAddressList(String userId) {// TODO Auto-generated method stub System.out.println("UserServiceImpl..3....."); UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y"); UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");// try {// Thread.sleep(2000);// } catch (InterruptedException e) {// e.printStackTrace();// } if(Math.random()>0.5) {throw new RuntimeException(); }return Arrays.asList(address1,address2); }
}
启动类
package com.yang.dubbo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.hystrix.EnableHystrix;import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;/** * 1、导入依赖; * 1)、导入dubbo-starter * 2)、导入dubbo的其他依赖 * @author lfy * * SpringBoot与dubbo整合的三种方式: * 1)、导入dubbo-starter,在application.properties配置属性,使用@Service【暴露服务】使用@Reference【引用服务】 * 2)、保留dubbo xml配置文件; * 导入dubbo-starter,使用@ImportResource导入dubbo的配置文件即可 * 3)、使用注解API的方式: * 将每一个组件手动创建到容器中,让dubbo来扫描其他的组件 *///@EnableDubbo //开启基于注解的dubbo功能//@ImportResource(locations="classpath:provider.xml")@EnableDubbo(scanBasePackages="com.yang.dubbo")@EnableHystrix //开启服务容错@SpringBootApplicationpublic class BootUserServiceProviderApplication {public static void main(String[] args) {
SpringApplication.run(BootUserServiceProviderApplication.class, args); }
}