首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何构建简单的Linkerd插件?

如何构建简单的Linkerd插件?
EN

Stack Overflow用户
提问于 2017-11-23 10:30:31
回答 1查看 182关注 0票数 0

我试图使用一些自定义的名称插件运行linkerd,但在启动时失败。我已经获得了io.l5d.fs的源代码,并切断了所有业务逻辑,以获得一些带有硬编码地址的极简示例。

初始器:

代码语言:javascript
复制
package com.consg
import io.buoyant.namer.NamerInitializer

class MyInitializer extends NamerInitializer {
  val configClass = classOf[MyConfig]
  override def configId = "com.consg.MyConfig"
}

object MyInitializer extends MyInitializer

配置:

代码语言:javascript
复制
package com.consg

import com.fasterxml.jackson.annotation.JsonIgnore
import com.twitter.finagle.{Path, Stack}
import io.buoyant.config.types.Directory
import io.buoyant.namer.NamerConfig

case class MyConfig(rootDir: Directory) extends NamerConfig {

  @JsonIgnore
  override def defaultPrefix: Path = Path.read("/my.namer")

  @JsonIgnore
  def newNamer(params: Stack.Params) = {
    println("params: " + params)
    new MyNamer(rootDir.path, prefix)
  }

}

纳梅尔:

代码语言:javascript
复制
package com.consg

import java.nio.file.{Path => NioPath}

import com.twitter.finagle._
import com.twitter.util._
import io.buoyant.namer.EnumeratingNamer

class MyNamer(rootDir: NioPath, prefix: Path) extends EnumeratingNamer {

  def lookup(path: Path): Activity[NameTree[Name]] = {
    println("lookup path: " + path)

    val address1 = Address("127.0.0.1", 7777)
    val addr = Addr.Bound(Set(address1), Addr.Metadata.empty)
    val varr = Var.apply(addr)

    Activity.value(NameTree.Leaf(Name.Bound(varr, path, path)))
  }

  override def getAllNames: Activity[Set[Path]] = {
    println("getAllNames!")
    Activity.value(Set.apply(Path.read("animal")))
  }
}

build.sbt

代码语言:javascript
复制
name := "plug"
version := "1"
scalaVersion := "2.12.1"

libraryDependencies += "io.buoyant" % "linkerd-core_2.12" % "1.3.2" % "provided"

此外,我还在META-INF/services/io.buoyant.namer.NamerInitializer下公开了"com.consg.MyInitializer“服务。

然后构建插件jar &将其置于插件(linkerd-1.3.1/ plugins )下。

现在,我尝试使用config运行linkerd:

代码语言:javascript
复制
namers:
- kind: com.consg.MyConfig
  rootDir: disco

routers:
- protocol: http
  dtab: /svc => /#/my.namer;
  servers:
  - port: 8080

结果我得到了:

代码语言:javascript
复制
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'com.consg.MyConfig' into a subtype of [simple type, class io.buoyant.namer.NamerConfig]: known type ids = [NamerConfig, io.l5d.consul, io.l5d.curator, io.l5d.dnssrv, io.l5d.fs, io.l5d.k8s, io.l5d.k8s.external, io.l5d.k8s.ns, io.l5d.marathon, io.l5d.rewrite, io.l5d.serversets, io.l5d.zkLeader]

所以看起来这个插件根本没有加载。需要帮助。

github代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-23 11:24:56

看来我的问题是未定义的$L5D_HOME环境变量。在我设置好插件之后,插件就启用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47453288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档