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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 有了速卖通中间件的spring-boot-starter-hsf,在基于Spring Boot微服务中使用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());
    }
}
目录
相关文章
|
8天前
|
消息中间件 负载均衡 Java
Java一分钟之-Spring Cloud:微服务架构工具集
【6月更文挑战第8天】本文介绍了Spring Cloud的核心组件,包括Eureka(服务注册与发现)、Ribbon(客户端负载均衡)、Zuul(API网关)、Hystrix(断路器)、Spring Cloud Config(配置中心)和Spring Cloud Bus(事件总线)。文中强调了各组件的易错点,如Eureka的服务注册失败、Ribbon的配置、Zuul的路由错误、Hystrix的启用及配置、Config Server的加载失败和Bus的通讯问题,并给出了相应的代码示例和解决建议。在实际开发中,关注日志和使用调试工具是保证微服务系统稳定运行的关键。
89 6
|
21小时前
|
安全 Java API
Java一分钟之-Spring Data REST:创建RESTful服务
【6月更文挑战第15天】Spring Data REST让基于Spring Data的项目轻松创建REST API,免去大量控制器代码。通过自动HTTP映射和链接生成,简化CRUD操作。文章涵盖启用REST、配置仓库、自定义端点、解决过度暴露、缺失逻辑和安全性问题,提供代码示例,如自定义Repository、投影和安全配置,强调在利用其便利性时注意潜在挑战。
16 5
|
2天前
|
前端开发 JavaScript Java
计算机Java项目|SpringBoot家政服务管理平台
计算机Java项目|SpringBoot家政服务管理平台
|
3天前
|
监控 安全 自动驾驶
基于java+单体服务 + 硬件(UWB定位基站、卡牌)技术架构开发的UWB室内定位系统源码 UWB定位技术 超宽带定位 高精度定位系统源码
基于java+单体服务 + 硬件(UWB定位基站、卡牌)技术架构开发的UWB室内定位系统源码 UWB定位技术 超宽带定位 高精度定位系统源码
14 3
|
8天前
|
监控 数据管理 Java
智慧城管源码,基于微服务+java+springboot+vue+uniapp开发的城管综合执法系统源码
智慧城管执法系统利用微服务和Java技术提升城市管理水平,涵盖事件处理、投诉、处罚等功能,包含PC和APP源码。系统支持执法APP,便于领导随时随地审批,具备文书模板、地图定位、法规查询等功能。此外,执法办案系统通过监控视频分析事件,实现案件全程闭环管理,包括组织、案件、信用和执法队伍管理,以及法规库等基础支撑。系统旨在优化流程,提高数据管理和效率。
智慧城管源码,基于微服务+java+springboot+vue+uniapp开发的城管综合执法系统源码
|
8天前
|
安全 Java 开发者
Java一分钟之-Spring Cloud Netflix Eureka:服务注册与发现
【6月更文挑战第8天】Spring Cloud Eureka是微服务架构的关键,提供服务注册与发现功能。本文讲解Eureka工作原理、配置、常见问题及解决方案。Eureka包含Server(管理服务状态)和Client(注册服务实例并发现服务)。快速入门包括启动Eureka Server和创建Eureka Client。常见问题涉及服务注册不上、服务下线和客户端注册信息不准确,可通过检查网络、理解自我保护机制和配置元数据解决。此外,文中还提及健康检查、安全配置和集群部署等高级实践,以增强系统健壮性和扩展性。
55 8
|
8天前
|
存储 消息中间件 Java
Java一分钟之-Spring Cloud Config:外部化配置
【6月更文挑战第8天】Spring Cloud Config提供外部化配置,通过Config Server管理和版本控制微服务配置。本文涵盖Config Server与Client的配置、常见错误、多环境配置、实时更新及使用示例。注意配置服务器URL、环境变量设置、Bus配置以及安全问题。使用Config能提升系统灵活性和可维护性,但要留意日志以确保配置正确和安全。
88 10
|
9天前
|
监控 前端开发 JavaScript
|
9天前
|
监控 Java 数据库连接
Java一分钟之-Spring Boot:快速开发微服务
【6月更文挑战第7天】本文探讨了Spring Boot开发中的常见问题,包括起步依赖与版本管理、自动配置、启动类位置、日志配置、数据库连接、错误处理和Actuator监控。建议使用最新稳定版Spring Boot,通过`spring-boot-starter-parent`管理版本,理解自动配置原理,正确放置启动类,配置日志级别,准确设置数据库连接参数,自定义全局异常处理器,以及启用Actuator进行监控。不断学习和实践是应对各种问题的关键。
24 1
|
9天前
|
移动开发 Java API
Java Socket编程 - 简单的问候服务实现
Java Socket编程 - 简单的问候服务实现
10 0