多租户微服务中使用Java Config注册HSF服务

有了速卖通中间件的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());
    }
}
时间: 2024-10-01 01:05:25

多租户微服务中使用Java Config注册HSF服务的相关文章

将Java程序注册成系统服务

你是不是在找将Java程序注册成系统服务的方法?试试Java Service Wrapper这个工具吧,你可以从这个网站上面下载你喜欢的版本:http://wrapper.tanukisoftware.org/ ,Java Service Wrapper提供了适合市面上流行的操作系统的版本. 使用Wrapper将Java程序注册成系统服务有三种方式可供选择: 第一种是使用WrapperSimpleApp 这个帮助类来运行你的程序,这个是最简单的方法,也是官方推荐使用的方式,但是这样可能会对你的程

如何在Windows Azure中使用Java相关技术

我们刚刚发布了一个新教程和示例代码,以阐述如何在Windows Azure中使用 Java 相关技术.在该指南中,我们提供了分步教程,说明如何将 Java Spring Framework 应用程序(PetClinic 示例应用程序)迁移到 Windows Azure 云.此文档附带的代码同样也发布在 GitHub 中.我们鼓励 Java 开发人员下载并探索此新示例和教程. Windows Azure 是一个开放的云平台,它支持各种编程语言和框架,包括 Microsoft .NET.Java.N

在容器服务中如何暴露服务到公网并配置负载均衡

在容器服务中,暴露应用提供的服务到公网有两种选择,一种是通过系统默认的路由应用acsrouting暴露服务到公网,适用的场景是:普通且简单的7层协议负载均衡,web页面访问路由服务,容器集群内服务之间7层协议互相访问的通信代理和负载均衡.另外一种是通过自定义SLB方式暴露服务,这种方式是属于较高级的功能,适用的场景是:4层协议负载均衡,自定义各服务的路由,在将传统架构迁移到容器架构过程中非容器集群的服务访问容器集群中容器的服务.下面分别以举例的方式介绍这些暴露服务到公网并配置负载均衡的能力. 如

将批处理文件注册成服务

  将批处理文件注册成服务 前两天完成了将java程序注册成win服务,如今本人有一个java工程起重含有启动脚本startagent.bat.我想要达到的效果是:当系统启动的时候就自动调用startagent.bat脚本,于是开始网上寻求相关资料. 1.首先由师兄提示可以使用系统命令sc实现 sc create 服务名 binPath= .bat文件所在路径 start=auto (注意 =后面有空格,如果文件路径中含空格则使用引号引起来) 具体的参数可以使用sc /?来查看. 安装倒是挺顺利

将批处理文件注册成服务在系统启动的时候自动调用

 如何将批处理文件注册成服务,在系统启动的时候就自动调用startagent.bat脚本,下面是具体的实现过程,需要的朋友可以参考下 前两天完成了将java程序注册成win服务,如今本人有一个java工程起重含有启动脚本startagent.bat.我想要达到的效果是:当系统启动的时候就自动调用startagent.bat脚本,于是开始网上寻求相关资料.    1.首先由师兄提示可以使用系统命令sc实现    sc create 服务名 binPath= .bat文件所在路径 start=aut

Java微服务开发指南 -- Java环境下的微服务

Java环境下的微服务 本文涉及的内容,能让你学到什么?     本书适用于开发微服务的Java开发人员和架构师.我们在开始介绍微服务架构前,先讲述一些抽象的基本概念.不幸的是,使用新技术并不能神奇地解决分布式系统问题.但是我们通过一些做的很好的公司,它们是如何使用微服务来进行构建的,包括文化.组织结构和市场压力.然后我们深入了解几个Java微服务框架,附带的源代码反馈可以在GitHub上找到.我们会讨论有关部署.集群.故障转移以及Docker和Kubernetes在这些领域是如何解决这些问题.

浅谈java中异步多线程超时导致的服务异常_java

在项目中为了提高大并发量时的性能稳定性,经常会使用到线程池来做多线程异步操作,多线程有2种,一种是实现runnable接口,这种没有返回值,一种是实现Callable接口,这种有返回值. 当其中一个线程超时的时候,理论上应该不 影响其他线程的执行结果,但是在项目中出现的问题表明一个线程阻塞,其他线程返回的接口都为空.其实是个很简单的问题,但是由于第一次碰到,还是想了一些时间的.很简单,就是因为阻塞的那个线 程没有释放,并发量一大,线程池数量就满了,所以其他线程都处于等待状态. 附上一段自己写的调

在微服务中如何管理数据

来自Stitch Fix团队的工程副总裁Randy Shoup在QCon纽约2017会议上讨论了如何在基于微服务的应用中管理数据和隔离持久化.他还介绍了将事件(Event)作为微服务的第一类构造.他介绍自己的团队将机器学习技术应用到了业务的各个组成部分,比如购买.库存管理以及风格推荐等. 个性化推荐会基于库存运行机器学习,从而创建出推荐的算法.这些推荐算法随后会被全国范围内的设计师所监管,从而形成个性化风格的推荐. 微服务架构是渐进演化的.像eBay.Twitter和Amazon这样的组织都经历

Java项目跨服务中文乱码:从A服务中增加一条中文的记录,到了B服务的数据库中就变成了乱码

问题描述 [color=brown][color=darkred]最近在做一个项目,有一个功能是这样的:A服务中有个通讯录功能,可以对通讯录进行增删改查的操作.但通讯录是存在B服务中的数据库的.那么问题出现了,从A服务中增加一条中文的记录,到了B服务的数据库中就变成了乱码,然后在B服务的页面输出通讯录时,因为它没有做转码处理,所以显示是乱码.该怎么做能让A服务储存进去的中文在B服务的数据库中不是乱码呢?(PS:B服务数据库中的那个乱码字段是UTF-8编码,A服务存的时候该字段也是UTF-8编码[