Skip to content
pbting edited this page Jan 16, 2019 · 11 revisions

Spring Cloud AliCloud ANS

ANS(Application Naming Service) 是隶属于阿里云 EDAS 产品的组件, Spring Cloud AliCloud ANS 提供了 Spring Cloud 规范下商业版的服务注册与发现,可以让用户方便的在本地开发,同时也可以运行在云环境里。

如何引入 Spring Cloud AliCloud ANS

Spring Cloud Alibaba 已经发布了 0.2.0.RELEASE 版本,需要首先导入依赖管理 POM。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

接下来引入 Spring Cloud AliCloud ANS Starter 即可。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alicloud-ans</artifactId>
</dependency>

使用ANS进行服务注册

当客户端引入了 Spring Cloud AliCloud ANS Starter 以后,服务的元数据会被自动注册到注册中心,比如IP、端口、权重等信息。客户端会与服务端保持心跳,来证明自己可以正常提供服务。

以下是一个简单的应用示例。

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ProviderApplication {

    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

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

}

既然服务会被注册到注册中心,那么肯定需要配置注册中心的地址,在 application.properties 中,还需要配置上以下地址。

# 应用名会被作为服务名称使用,因此会必选
spring.application.name=ans-provider
server.port=18081
# 以下就是注册中心的IP和端口配置
spring.cloud.alicloud.ans.server-list=127.0.0.1
spring.cloud.alicloud.ans.server-port=8080
Note
此时没有启动注册中心,启动应用会报错,因此在应用启动之前,应当首先启动注册中心。

启动注册中心

ANS 使用的注册中心有两种,一种是完全免费的轻量版配置中心,主要用于开发和本地调试,一种是云上注册中心,ANS 依托于阿里云 EDAS 产品提供服务注册的功能。通常情况下,可以使用轻量版配置中心作为开发和测试环境,使用云上的 EDAS 作为灰度和生产环境。

启动轻量版配置中心

轻量版配置中心的下载和启动方式可参考 这里

Note
只需要进行第1步(下载轻量配置中心)和第2步(启动轻量配置中心)即可,第3步(配置hosts)在与 ANS 结合使用时,不需要操作。

启动完轻量版配置中心以后,直接启动 ProviderApplication ,即可将服务注册到轻量版配置中心,由于轻量版配置中心的默认端口是8080,因此你可以打开 http://127.0.0.1:8080 ,点击左侧"服务列表",查看注册上来的服务。

使用云上注册中心

使用云上注册中心,可以省去服务端的维护工作,同时稳定性也会更有保障。当使用云上注册中心时,代码部分和使用轻量配置中心并没有区别,但是配置上会有一些区别。

以下是一个简单的使用云上配置中心的配置示例。

# 应用名会被作为服务名称使用,因此是必选
spring.application.name=ans-provider
# 端口配置自由配置即可
server.port=18081
# 以下就是注册中心的IP和端口配置,因为默认就是127.0.0.1和8080,因此以下两行配置也可以省略
spring.cloud.alicloud.ans.server-mode=EDAS
spring.cloud.alicloud.access-key=你的阿里云AK
spring.cloud.alicloud.secret-key=你的阿里云SK
spring.cloud.alicloud.edas.namespace=cn-xxxxx

server-mode 的默认值为 LOCAL ,如果要使用云上注册中心,则需要更改为 EDAS 。

access-key 和 secret-key 则是阿里云账号的 AK/SK,需要首先注册阿里云账号,然后登陆 阿里云AK/SK管理页面 ,即可看到 AccessKey ID 和 Access Key Secret ,如果没有的话,需要点击"创建 AccessKey"按钮创建。

namespace 是阿里云 EDAS 产品的概念,用于隔离不同的环境,比如测试环境和生产环境。要获取 namespace 需要 开通 EDAS 服务,按量计费模式下开通是免费的,开通以后进入 EDAS控制台,即可看到对应的 namespace,比如 cn-hangzhou。

Note
EDAS 提供应用托管服务,如果你将应用托管到 EDAS,那么 EDAS 将会自动为你填充所有配置。

Eureka 如向 ANS 迁移

Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态,后续不再进行更新已成为事实。作为开发者的我们,如何使用极简的方式替换现有的 Netflix 组件成为了首要解决的问题。Spring Cloud Alibaba 实现了 Spring Cloud 服务注册的标准规范,这就天然的给开发者提供了一种非常便利的方式将服务注册中心的 Eureka 迁移到商业化的组件 ANS 。

下面是大致整理了 SCN 迁移 SCA 之 Eureka 迁移的三种方案。

  • 方案1: 重启进程迁移

客户改造完代码后,直接停掉所有的进程并重新部署新代码到 EDAS 上。

缺点:需要停机

  • 方案 2: 切流迁移

即准备两套环境,一套是迁移后的环境,一套现有的环境。总的流量入口控制访问流量流入迁移后的环境还是现有环境,两环境之间的服务是不可调用的。当迁移后的环境跑一段时间服务运行稳定后,对现有的环境机器总体停机,流量全部打到迁移后的环境;如果有问题,入口流量切断迁移后的环境,流量又访问现有的环境。

缺点:维护机器成本增加一倍

  • 方案 3: 混存迁移

在现有的环境里,对部分服务进行迁移的改造,部署后,服务既注册于 Eureka,又注册于 ANS 。当所有的服务都注册于 ANS 时,迁移完成,直接将 Eureka 的服务下线调。

**缺点:实现起来较有挑战,需要双注册,双定阅。

接下来将重点讨论下 混存迁移 的具体实现。

混存迁移的核心思路是在 ANS Starter 中,支持多注册中心的双注册/双订阅,以此来达到不需要全部重启进程,也不需要增加一套环境的目的,降低成本,提高服务的在线服务时长。

在 Spring Cloud 服务注册与发现的规范中,只能支持单注册中心,这主要是因为在 Spring Cloud 的服务注册与发现过程中,限制了在 Spring 的 Ioc 容器中只能存在一个 AnsServiceRegistry、AnsRegistration、AbstractAutoServiceRegistration 三种类型的 Bean。因此首要解决的第一个问题是:如何解决 Eureka Starter 和 ANS Starter 共存的问题 ?

如何解决 Eureka 和 ANS Starter 可同时引入

Clone this wiki locally