有了速卖通中间件的spring-boot-starter-hsf,在基于Spring Boot微服务中使用HSF,是件简单而惬意的事情。
我们首先来看最简单的服务注册
@HSFProvider(serviceInterface = QasHsfService.class, serviceVersion = "1.0.0.qas", serviceGroup = "HSF")
public class QasHsfServiceImpl implements QasHsfService {
...
}
再附上最简单的服务调用
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(QasHsfApplication.class)
public class QasHsfServiceConsumer {
@HSFConsumer(serviceVersion = "1.0.0.qas", serviceGroup = "HSF")
private QasHsfService qasHsfService;
@Test
public void testQuestion() {
qasHsfService.question(new QasRequest());
}
}
然后是入口类
@SpringBootApplication
@EnableHSF
@PropertySource("file:/opt/qas/qas.properties")
public class QasHsfApplication {
public static void main(String[] args) {
SpringApplication.run(QasHsfApplication.class, args);
}
}
然后是……,没有了,就这么愉快地结束了。
以上代码实现,对于通用的微服务来说已经足够。但对于我们iDST的智能语音交互服务来说,还差点东西要填。
我们的每一种服务(确切地说,是由一份Java代码+一份C++代码编译后,容器化的一个镜像)会因为启动时引导的租户配置不同,而加载不同的算法模型。容器启动后,不同租户的服务,只在流程上是一致的。也就是说,镜像是一个,容器按租户分组。
那么,使用@HSFProvider
这种静态注册服务的方式就不够用了,服务启动时,要从运维系统获取租户的分组信息,然后将其作为服务名称的一部分,注册为HSF服务。
这时,最理想、最优雅的方式就是使用Java Config来编程实现了:
@Configuration
public class QasHsfProviderConfig {
@Bean(initMethod = "init")
public HSFSpringProviderBean qasHsfProviderService() {
HSFSpringProviderBean providerBean = new HSFSpringProviderBean();
providerBean.setServiceInterface("com.aliyun.nls.hsf.QasHsfService");
providerBean.setTarget(qasHsfServiceImpl());
providerBean.setServiceVersion("1.0.0." + whoAmI());
providerBean.setServiceGroup(HSFGroup.HSF.toString());
return providerBean;
}
@Bean
public QasHsfServiceImpl qasHsfServiceImpl() {
return new QasHsfServiceImpl();
}
private String whoAmI() {
//mock
return "aliyun";
}
}
相应地,服务调用可以是这样(调用端使用上述方式也是可以的,这里只为了保持风格一致,别怪我强迫症):
@Configuration
public class QasHsfConsumerConfig {
@Bean(initMethod = "init",name="qasHsfConsumerService")
public HSFSpringConsumerBean qasHsfConsumerService() {
HSFSpringConsumerBean consumerBean = new HSFSpringConsumerBean();
consumerBean.setInterfaceName("com.aliyun.nls.hsf.QasHsfService");
consumerBean.setVersion("1.0.0.aliyun");
consumerBean.setGroup(HSFGroup.HSF.toString());
return consumerBean;
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(QasHsfApplication.class)
public class QasHsfServiceConsumer {
@Autowired
@Qualifier("qasHsfConsumerService")
private QasHsfService qasHsfService;
@Test
public void testQuestion() {
qasHsfService.question(new QasRequest());
}
}