《Spring Cloud Alibaba 从入门到实战》分布式配置

分布式配置

1、简介

Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。

Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。

2、学习目标

  • 使用 Nacos Config 作为 Spring Cloud 分布式配置
  • 使用 Nacos Config 实现 Bean 动态刷新
  • 了解 Nacos Config 高级配置

3、详细内容

  • 快速上手:使用 Nacos Config 作为外部化配置源
  • 多文件扩展名支持:以 YAML 文件扩展名为例,讨论 Nacos Config 多文件扩展名支持
  • 动态配置更新:演示 @RefreshScope 特性,实现 Bean 动态刷新
  • 自定义扩展:自定义 namespace、Group 以及 Data Id 的配置扩展
  • 运维特性:演示 Nacos Config 高级外部化配置以及 Endpoint 内部细节

4、快速上手

引入 Nacos Config 的两种方式

Nacos Config 引入的方式同样也有两种,即 Aliyun Java Initializr(云原生应用脚手架)引入和 Maven pom.xml 依赖。

官方推荐使用 Aliyun Java Initializr 方式引入 Nacos Discovery,以便简化组件之间的依赖关系。

快速上手

以脚手架引入为例

选择三个组件:
在这里插入图片描述

生成的相应依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

版本号问题

不过该 starter 并未指定版本,具体的版本声明在 com.alibaba.cloud:springcloud-alibaba-dependencies 部分

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

它们的版本定义在 <properties> 元素中,即 2.2.1.RELEASE2.3.0.RELEASE

<properties>
	<java.version>1.8</java.version>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
	<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>

启动 Nacos 服务器

阿里为开发者提供了一套免费的 Nacos Server :进入 http://139.196.203.133:8848/nacos/ 查看控制台(账号名/密码为 nacos-configuration/nacos-configuration)。

具体启动方式参考 Nacos 快速开始。

操作流程官方示例

  1. 选择 “配置管理/配置列表”

  2. 由于服务是公共免费的,为了做好隔离,所以分布式配置的功能,请选择在 sandbox -configuration 的命名空间下操作

  3. Data ID 由应用名(nacos-config-sample)+ 文件后缀名(.properties) 组成,配置内容:

    user.name=nacos-config-sampleuser.age=90
    

    应用名:对应 spring.application.name=xxx 中的 xxx 部分

  4. 回到应用 nacos-config-sample 工程,在 resources 目录下新建名为 “application.properties" 文件,并配置以下内容:

    spring.cloud.nacos.config.server-addr=139.196.203.133:8848
    spring.cloud.nacos.config.username=nacos-configuration
    spring.cloud.nacos.config.password=nacos-configuration
    spring.cloud.nacos.config.namespace=sandbox-configuration
    
  5. 读取 Nacos Config 实现

    	@SpringBootApplicationpublic class NacosConfigSampleApplication {
    		@Value("${user.name}")
    		private String userName;
    		@Value("${user.age}")
    		private int userAge;
    		@PostConstruct
    		public void init() {
    			System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);
    		}
    		public static void main(String[] args) {
    			SpringApplication.run(NacosConfigSampleApplication.class, args);
    		}
    	}
    
  6. 启动 Nacos Config 应用

    运行 nacos-config-sample 引导类 NacosConfigSampleApplication,观察控制台结果(截取关键日志信息):

    [init] user name : nacos-config-sample , age : 9
    

5、使用 Nacos Config 实现 Bean 动态刷新

Nacos Config 支持标准 Spring Cloud @RefreshScope 特性,即应用订阅某个 Nacos 配置后,当配置内容变化时,Refresh Scope Beans 中的绑定配置的属性将有条件的更新

所谓的条件是指 Bean 必须:

  1. 必须条件:Bean 的声明类必须标注 @RefreshScope
  2. 二选一条件:
    • 属性(非 static 字段)标注 @Value
    • @ConfigurationProperties Bean

除此之外,Nacos Config 也引入了 Nacos Client 底层数据变化监听接口, 即 com.alibaba.nacos.api.config.listener.Listener

Nacos Client:Nacos 客户端 API,也是 Nacos Config 底层依赖

@Value 场景分析

代码实现

@SpringBootApplication
@RestController
@RefreshScopepublic
class NacosConfigSampleApplication {
    @Value("${user.name}")
    private String userName;
    @Value("${user.age}")
    private int userAge;

    @PostConstruct
    public void init() {
        System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);
    }

    @PreDestroy
    public void destroy() {
        System.out.printf("[destroy] user name : %s , age : %d%n", userName, userAge);
    }
}

当 Nacos Config 接收到服务端配置变更时,对应的 @RefreshScope Bean 生命周期回调方法会被调用,并且是【先销毁】,然后又【重新初始化】。

要意识到 NacosConfig 配置变更对 @RefreshScope Bean 生命周期回调方法的影响,避免出现重复初始化等操作。

注: Nacos Config 配置变更调用了 Spring Cloud API ContextRefresher,该 API 会执行以上行为。同理,执行 Spring Cloud Acutator Endpoint refresh 也会使用 ContextRefresher

@ConfigurationProperties Bean 的场景分析

1、新增 User 类

@RefreshScope
@ConfigurationProperties(prefix = "user")
public class User implements InitializingBean, DisposableBean {

    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

2、修改 NacosConfigSampleApplication 代码

@SpringBootApplication
@RestController
@RefreshScope
@EnableConfigurationProperties(User.class)
public class NacosConfigSampleApplication {
    @Value("${user.name}")
    private String userName;
    @Value("${user.age}")
    private int userAge;
    @Autowired
    private User user;

    @PostConstruct
    public void init() {
        System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);
    }

    @PreDestroy
    public void destroy() {
        System.out.printf("[destroy] user name : %s , age : %d%n", userName, userAge);
    }

    @RequestMapping("/user")
    public String user() {
        return "[HTTP] " + user;
    }

    public static void main(String[] args) {
        SpringApplication.run(NacosConfigSampleApplication.class, args);
    }
}

主要改点:

  • 激活 @ConfigurationProperties Bean @EnableConfigurationProperties(User.class)
  • 通过 @Autowired 依赖注入 User Bean。
  • 使用 user Bean 的 toString() 方法替换 user() 中的实现

Nacos Config 监听实现 Bean 属性动态刷新

代码实现

@Configuration
@EnableConfigurationProperties(User.class)
public class NacosConfigDemoConfiguration {

    @Autowired
    private NacosConfigManager nacosConfigManager;

    @Autowired
    private User user;

    @Value("${user.name}")
    private String userName;

    @Value("${user.age}")
    private int userAge;

    @Bean
    public ApplicationRunner runner() {
        return args -> {
            String dataId = "nacos-config-sample.properties";
            String group = "DEFAULT_GROUP";
            nacosConfigManager.getConfigService().addListener(dataId, group, new AbstractListener() {
                @Override
                public void receiveConfigInfo(String configInfo) {
                    System.out.println("[Listener] " + configInfo);
                    System.out.println("[Before User] " + user);

                    Properties properties = new Properties();
                    try {
                        properties.load(new StringReader(configInfo));
                        String name = properties.getProperty("user.name");
                        int age = Integer.valueOf(properties.getProperty("user.age"));
                        user.setName(name);
                        user.setAge(age);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    System.out.println("[After User] " + user);
                }
            });
        };
    }


    @PostConstruct
    public void init() {
        System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);
    }

    @PreDestroy
    public void destroy() {
        System.out.printf("[destroy] user name : %s , age : %d%n", userName, userAge);
    }
}

代码主要变化:

  1. @Autowired 依赖注入 NacosConfigManager

  2. 新增 runner() 方法,通过 NacosConfigManagerBean 获取 ConfigService,并增加了 AbstractListener( Listener 抽象类)实现,

    监听 dataId = "nacos-configsample.properties"group = "DEFAULT_GROUP"

重启应用,并将配置 user.age 从 90 调整到 19,观察日志变化:

[Listener] user.name=nacos-config-sampleuser.age= 19
[Before User] User{name='nacos-config-sample', age=90}
[After User] User{name='nacos-config-sample', age=19}

总结

上述三个例子均围绕着 Nacos Config 实现 Bean 属性动态更新,不过它们是 Spring Cloud 使用场景。

如果读者的应用仅使用 Spring 或者 Spring Boot,可以考虑 Nacos Spring 工程,Github 地址:https://github.com/nacos-group/nacos-spring-project,其中 @NacosValue 支持属性粒度的更新。

6、Nacos Config 高级配置

支持自定义 namespace 的配置

例如:

spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7

注:该配置必须放在 bootstrap.properties 文件中

支持自定义 Group 的配置

例如:

spring.cloud.nacos.config.group=DEVELOP_GROUP

支持自定义扩展的 Data Id 配置

一个完整的配置案例如下所示:

spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true

可以看到:

  1. 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的配置方式来支持多个 Data Id 的配置。
  2. 通过 spring.cloud.nacos.config.extension-configs[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  3. 通过 spring.cloud.nacos.config.extension-configs[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新,感知到最新的配置值。默认是不支持的。

需要注意的点:

  • 多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高
  • spring.cloud.nacos.config.extension-configs[n].data-id值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。

清晰案例

# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml
# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1
# 配置 Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.shared-configs[0].refresh=true

配置的优先级

目前提供了三种配置能力从 Nacos 拉取相关的配置。

A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置

B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置

C: 通过内部相关规则(应用名、应用名 + Profile )自动生成相关的 Data Id 配置(运行参数配置)

当三种方式共同使用时,他们的一个优先级关系是:A < B < C

完全关闭配置

可以通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config

7、Nacos Config Actuator Endpoint

Nacos Config 内部提供了一个 Endpoint, 对应的 Endpoint ID 为 nacos-config,其 Actuator Web Endpoint URI 为 /actuator/nacos-config。

注:使用 Nacos Config Spring Cloud 1.x 版本的话,其 URI 地址则为 /nacos-config

其中,Endpoint 暴露的 json 中包含了三种属性(即服务响应内容):

  1. NacosConfigProperties: 当前应用 Nacos 的基础配置信息。
  2. RefreshHistory: 配置刷新的历史记录。
  3. Sources: 当前应用配置的数据信息
{
    "NacosConfigProperties":{
        "serverAddr":"127.0.0.1:8848",
        "username":"",
        "password":"",
        "encode":null,
        "group":"DEFAULT_GROUP",
        "prefix":null,
        "fileExtension":"properties",
        "timeout":3000,
        "maxRetry":null,
        "configLongPollTimeout":null,
        "configRetryTime":null,
        "enableRemoteSyncConfig":false,
        "endpoint":null,
        "namespace":null,
        "accessKey":null,
        "secretKey":null,
        "contextPath":null,
        "clusterName":null,
        "name":null,
        "sharedConfigs":null,
        "extensionConfigs":null,
        "refreshEnabled":true,
        "sharedDataids":null,
        "refreshableDataids":null,
        "extConfig":null,
        "configServiceProperties":{
            "secretKey":"",
            "namespace":"",
            "username":"",
            "enableRemoteSyncConfig":"false",
            "configLongPollTimeout":"",
            "configRetryTime":"",
            "encode":"",
            "serverAddr":"127.0.0.1:8848",
            "maxRetry":"",
            "clusterName":"",
            "password":"",
            "accessKey":"",
            "endpoint":""
        }
    },
    "RefreshHistory":[

    ],
    "Sources":[
        {
            "lastSynced":"2020-09-14 11:11:37",
            "dataId":"nacos-config-sample.properties"
        },
        {
            "lastSynced":"2020-09-14 11:11:37",
            "dataId":"nacos-config-sample"
        }
    ]
}
rverAddr":"127.0.0.1:8848",
            "maxRetry":"",
            "clusterName":"",
            "password":"",
            "accessKey":"",
            "endpoint":""
        }
    },
    "RefreshHistory":[

    ],
    "Sources":[
        {
            "lastSynced":"2020-09-14 11:11:37",
            "dataId":"nacos-config-sample.properties"
        },
        {
            "lastSynced":"2020-09-14 11:11:37",
            "dataId":"nacos-config-sample"
        }
    ]
}

参考书籍

重磅下载 | Java 开发者必备手册《Spring Cloud Alibaba 从入门到实战》,阿里双11同款!-阿里云开发者社区 (aliyun.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/235744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路灯控制系统中漏电保护怎么实施

应用场景1 应用于路灯配电箱的漏电检测 功能 可实时监测和显示路灯配电箱内多回路的剩余电流&#xff1b; 每只剩余电流监测仪最多可监测16个回路的剩余电流&#xff0c;剩余电流监测范围为1mA-30A&#xff1b; 每路剩余电流监测均可设置报警值&#xff0c;报警值的设置范围…

手机如何制作个人博客?安卓Termux+Hexo搭建博客网站并远程访问

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

Gateway全局异常处理及请求响应监控

前言 我们在上一篇文章基于压测进行Feign调优完成的服务间调用的性能调优&#xff0c;此时我们也关注到一个问题&#xff0c;如果我们统一从网关调用服务&#xff0c;但是网关因为某些原因报错或者没有找到服务怎么办呢&#xff1f; 如下所示&#xff0c;笔者通过网关调用acc…

dToF直方图之美_激光雷达多目标检测

直方图提供了一种简单有效的方法来分析信号分布并识别与目标存在相对应的峰值,并且能够可视化大量数据,让测距数形结合。在车载激光雷达中,对于多目标检测,多峰算法统计等,有着区别于摄像头以及其他雷达方案的天然优势。 如下图,当中有着清晰可见的三个峰值,我们可以非…

基于ssm的电动车租赁网站论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本电动车租赁网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

Draw.io or diagrams.net 使用方法

0 Preface/Foreword 在工作中&#xff0c;经常需要用到框图&#xff0c;流程图&#xff0c;时序图&#xff0c;等等&#xff0c;draw.io可以完成以上工作。 official website:draw.io 1 Usage 1.1 VS code插件 draw.io可以扩展到VS code工具中。

Java Web——过滤器 监听器

目录 1. Filter & 过滤器 1.1. 过滤器概述 1.2. 过滤器的使用 1.3. 过滤器生命周期 1.4. 过滤器链的使用 1.5. 注解方式配置过滤器 2. Listener & 监听器 2.1. 监听器概述 2.2. Java Web的监听器 2.2.1. 常用监听器 2.2.1.1. ServletContextListener监听器 …

SM4加密算法的侧信道攻击实现

SM4 算法有多个位置存在泄漏点&#xff0c;如下图所示&#xff1a; 在位置1和2&#xff0c;可以逐个字节攻击密钥&#xff0c;因为密钥和中间结果之间没有扩散&#xff0c;这时通常取Sbox的输出作为攻击点&#xff0c;因为在位置2处的功耗是大于位置1的&#xff0c;但是在FPGA…

ODOO领先其他ERP的王炸功能:作业路线!(含MTO模式配置图表)

和众多ERP系统比较&#xff0c;ODOO-ERP中的作业路线功能可谓相当强大&#xff0c;可以自行定义供应链路线&#xff0c;以及单据同步生成。极大地增强了不同业务场景的适应性和业务管理效率&#xff01; 自定义供应路线的特点&#xff1a;对于很多灵活多变的企业而言&#xff…

Java架构师系统架构实现高内聚低耦合

目录 1 导语2 边界内聚耦合概述3 聚焦内聚4 关注耦合5 如何实现高内聚低耦合6 内聚耦合规划不当的效果7 总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语 架构设计的核心维度,从系统的扩展性、高性能、高可用、高安全性和伸缩性五个维度进行了探讨,并介绍了…

JavaEE:计算机是如何工作的

JavaEE学什么&#xff1f; 主要学习Java开发网站后端&#xff0c;为后面学习Spring做铺垫 涉及的内容&#xff1a; 1&#xff09;操作系统基础知识 2&#xff09;多线程知识 3&#xff09;文件操作 4&#xff09;网络编程 5&#xff09;网络原理 6&#xff09;JVM 计算…

用到了C语言的函数指针功能。

请选择一个功能&#xff1a; 1. 加法 2. 减法 3. 乘法 4. 除法 5. 取模 6. 阶乘 7. 判断素数 8. 球体体积 9. 斐波那契数列 10. 幂运算 11. 最大公约数 12. 最小公倍数 13. 交换数字 14. 排序 15. 退出 请选择一个选项&#xff1a; #include <stdio.h> #include <stdl…

強強联手!M88明陞宣布与G2 电子竞技俱乐部成为官方合作伙伴!

M88明陞作为亚洲领先的在线游戏平台&#xff0c;正式宣布与G2电子竞技俱乐部建立具有突破性意义的官方合作伙伴关系&#xff0c;G2电子竞技俱乐部是全球领先的电子竞技品牌之一。作为官方合作伙伴关系&#xff0c;双方将合作开展一系列活动。 M88明陞将在G2 电子竞技俱乐部追求…

工单质检上线提升企业IT服务质量管理,智能服务能力再添新翼!甄知燕千云全新版本V1.26.0发布!

燕千云数智化业务服务平台在11月24日发布了V1.26.0版本&#xff0c;本次主要新增了工单质检、SLA绩效管理和上下游管理能力升级、以及自动预测工单流转趋势的功能&#xff0c;以支持更多的IT服务场景。同时&#xff0c;呼叫中心新增了智能分配客服、工单关联会话记录、客服消息…

RT-Thread学习笔记(六):RT_Thread系统死机日志定位

RT_Thread系统死机日志定位 一、RT_Thread系统死机日志定位二、Cortex-M3 / M4架构知识2.1 Cortex-M3 / M4架构概述2.2 寄存器用途 三、排查步骤 一、RT_Thread系统死机日志定位 RT-Thread 系统发生hardfault死机时&#xff0c;系统默认会打印出一系列寄存器状态帮助用户定位死…

NOIP2016提高组第二轮day2 - T3:愤怒的小鸟

题目链接 [NOIP2016 提高组] 愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔。简单来说&#xff0c;这款游戏是在一个平面上进行的。 有一架弹弓位于 ( 0 , 0 ) (0,0) (0,0) 处&#xff0c;每次 Kiana 可以用它向第一象限发射一只红色的小鸟&#xff0c;小鸟…

【T3】安装畅捷通T3软件,错误代码0x800A0146,描述:未找到标识符为‘138’的资源。

【问题描述】 安装畅捷通T3软件过程中&#xff0c;提示&#xff1a; 错误代码0x800A0146 描述&#xff1a;未找到标识符为‘138’的资源&#xff0c; 安装程序将立即终止。 【解决方法】 该错误是因为安装过程中检测到数据库版本过高。 首先T3普及版/标准版11.2版本支持数据库…

48.0/图片和多媒体文件的使用(详细版)

目录 48.1 网页中插入图片 48.1.1 基本语法 48.1.2 常见属性 48.2 图片超链接 48.3 设置图片热区链接 48.4 将图片作为网页背景 48.5 滚动字幕 48.6 插入多媒体文件 48.1 网页中插入图片 48.1.1 基本语法 <img src=“图片地址”> img 标记用于将图像插入到 HTML…

深度解析HarmonyOS开发-活动召集令元服务【鸿蒙北向应用开发实战】

目录 一&#xff0e;元服务和ArkTS语言简介1.1 学习元服务1.2 元服务带来的变革1.3 元服务全场景流量入口1.4 ArkTS学习1.5 ArkTS特点 二&#xff0e;DevEco Studio开发工具2.1 DevEco Studio学习2.2 DevEco Studio的主要特性2.3 端云一体化开发2.3.1端云一体化开发特点 2.4 低…

Zidebactam sodium salt β-内酰胺酶抑制剂 1706777-46-9科研

Zidebactam sodium salt β-内酰胺酶抑制剂 1706777-46-9 &#xff08;源自星戈瑞&#xff09; ATH686 FLT3 抑制剂 853299-52-2 Pelitrexol 抑制剂 446022-33-9 TBT1 转运蛋白抑制剂 52535-76-9 HFY-4A HDAC 抑制剂 2094810-82-7 SDR-04 BET 抑制剂 879593-54-1 Phthala…
最新文章