双核
畜牧信息服务(LIS)的一部分,它允许牲畜饲养者、所有者、代理商和牲畜饲养者使用 代表们记录和管理他们的动物.
@defra/lis-hubs-infra-core 是一个共享 npm 包与运行时间管道, 每个LIS 中枢
请求背景和相关性 身份证、记录、呼叫其他地雷影响调查服务
服务到服务代币, 和枢纽的代理 其语音.
它故意不涵盖认证、会话、角色或权限(见 下层访问)或哪个模块的枢纽 服务(见 登记) (中文(简体) ).
用于:
- 中枢 : lis-hubs-前台办公室, (中文(简体) ), 后办公室
- 发言: 丽丝-苹果-牛-家, (中文(简体) ), lis -apps - crattle - register (英语), (中文(简体) ), 百花齐放, (中文(简体) ), 鼠类动物死亡
- 软件包 : 下层访问, (中文(简体) ), 服务
安装
npm install @defra/lis-hubs-infra-core @defra/lis-hubs-infra-registry
@defra/lis-hubs-infra-registry 是同伴的依赖,所以消耗的应用也必须安装它.
使用量
日志
logger 是单人,共享 皮诺 写作的日志
东加勒比国家 cDP 的 OpenSearch 格式。 日志
遍及各地,包括请求处理者 别用霍比的 request.logger。 。 。 .
import { logger } from '@defra/lis-hubs-infra-core'
logger.level = config.get('log.level')
logger.enabled = config.get('log.enabled')
logger.format = 'ecs' // or 'pretty-print' for local development
logger.serviceName = 'lis-apps-cattle-home' // defaults to SERVICE_NAME
logger.serviceVersion = config.get('serviceVersion') // defaults to SERVICE_VERSION
logger.context.hashSecret = config.get('log.hashSecret')
await server.register(logger.hapiPlugin) // request and response logging
logger.info('Holding loaded')
logger.context 在请求中的每个日志行中添加的请求范围值.
过 true 作为将一个值与 hashSecret,这样你就可以关联
不记录的标识符 :
logger.context.set('cph', cph, true)
请求背景
requestContext.plugin 从 x-cdp-request-id 页眉,或生成
一,保留下来 其余的请求。 在其它插件之前注册 .
import { requestContext } from '@defra/lis-hubs-infra-core'
await server.register(requestContext.plugin)
requestContext.getHeaders() // { 'x-cdp-request-id': '...' }, for your own outbound calls
呼叫其他地雷影响调查服务
使用 createServiceClient 以呼叫另一个LIS服务(例如一个说话的be4fe). 它会:
- 为当前环境设计服务的基础 URL(
getServiceBaseUrl(中文(简体) ) - 添加相关 ID 头
- 添加一个
Authorization: Bearer来自 AWS STS 的服务符号(GetWebIdentityToken),与 目标服务的名称作为观众 - 发送
x-api-key如果你给它一个apiKey - 默认3秒后乘数(
timeout,以毫秒计,是 响应头和正体; 超时为504 - 持有 断路器 服务
circuitBreaker设置其failureThreshold财务报告和审定财务报表resetTimeout,或false关闭它)
import { createServiceClient } from '@defra/lis-hubs-infra-core'
const be4fe = createServiceClient({
environment,
serviceName: 'lis-be4fe-cattle-home',
port: 8087, // only used for 'local' and 'docker_compose'
apiKey
})
export async function getHolding(cph) {
const { payload } = await be4fe.get(`api/cphs/${encodeURIComponent(cph)}`)
return payload
}
它回来了 get, (中文(简体) ), post, (中文(简体) ), put, (中文(简体) ), patch 财务报告和审定财务报表 delete,每个选择一个路径 相对于服务
基础 URL 和 沉没 选项。 它们是简单的功能,所以可以
而客户持有的任何物品都无法从
外边 如果找不到服务标志,他们就会扔 ServiceTokenError;而服务
电路打开了, CircuitOpenError两者均带有 statusCode 页:1 一个无法通过其他电话
方式( 无法达到服务, 时间已过期, 或有错误状态的答案) 扔出
ServiceRequestError,包含 statusCode, (中文(简体) ), serviceName, (中文(简体) ), method, (中文(简体) ), path 财务报告和审定财务报表 cause
用于捕获错误的代码。 共享日志只发布错误的类型、消息和堆栈,
因此,一个打电话者如果想要他们在日志行中,必须把它们在消息中或者 logger.context。 。 。 .
当地,Lis -dev's lis-fake-sts 服务代表AWS STS. 见
服务代理 在lis-dev语中.
枢纽代理服务器
createProxyPlugin 用于中枢。 它为每个模块注册代理路由
@defra/lis-hubs-infra-registry 中枢列表,将请求转发到该模块的已发言和
发送已签名用户的 JWT 中枢,取自中枢会话 getUserToken输入
页:1 x-lis-jwt-assertion 请求页眉( JWT_ASSERTION_HEADER ) 。 它只转发 cookies_policy 同意饼干 COOKIES_POLICY_COOKIE_NAME 由此包导出常数 ,
因此,说话的布局可以使饼干横幅状态. 它从不发送 中心会话饼干,任何其他
饼干或浏览器 Authorization 并剥去任何客户端提供的副本 该头.
它发送会话的CSRF代币,由E lis-csrf 插件从 @defra/lis-infra-ui-services/csrf
时间 request.plugins['lis-csrf'].token,在 x-lis-csrf-token 页眉,并剥去任何客户端提供的内容
copy. 它的路线 plugins: { 'lis-csrf': { token: false } }: 中枢检查一个代理请求
声音检查它体内的标志物 中心流经未读处.
import { createProxyPlugin } from '@defra/lis-hubs-infra-core'
import { getHubJwt } from '@defra/lis-hubs-infra-access/authentication'
const proxy = createProxyPlugin({
hubId: 'front-office',
environment: config.get('environment'),
getUserToken: getHubJwt,
proxyTimeout: 30000, // optional, milliseconds to wait for a spoke's response headers; 30s by default
circuitBreaker: { failureThreshold: 5, resetTimeout: 30000 } // optional, see below for the defaults
})
await server.register(proxy.plugin)
每个模块都是 Spoke,它拥有模块的服务名称、基址和
断路器 并建造h2o2路线. 一个没有回答的演讲
proxyTimeout 得到一个504;一个无法达到,一个502.
发言者每个登记站挂载一个路线(/holdings/{cph*3}/cattle/{path*}, (中文(简体) ),
/animals/cattle/{path*}),在其中,请求路径的转发没有改变,所以已发言者
注册相同的完整模式并查看浏览器所要求的 URL。 hopi通过特异性匹配路线,而不是注册令,所以
/holdings/12/345/0001/cattle/register 到达了牛登记,而不是牛的家.
断路器
CircuitBreaker 保护一个下游服务的电话,是什么 createServiceClient 和枢纽
代理使用 。 只有运输失败(拒绝连接、暂停)才算作损失,
不管情况如何 证明服务已经启动 电路之前的电话结果
打开被忽略 .
- 关闭:呼叫通过.
failureThreshold连续失败( 默认为 5) 打开它 . - 打开: 呼叫快速失败
CircuitOpenError,一个503,用于resetTimeout毫秒(30分) 以默认方式). UI call-all使得"服务不可用,稍后再试"一页. - 半开:一个探测器呼叫通过,其余的迅速失效. 它的成功关闭了电路;
它的失败让它重新打开另一个
resetTimeout。 。 。 .
状态是每个过程的,所以每个中心或发言的例子自行决定. 每一个过渡是 在共享日志中登录:当电路打开时发出警告,当电路半开时发出信息,以及 当探测器关闭时.
import { CircuitBreaker } from '@defra/lis-hubs-infra-core'
const breaker = new CircuitBreaker({ name: 'lis-be4fe-cattle-home' })
breaker.assertCallAllowed() // throws CircuitOpenError while open; call immediately before the transport call
try {
res = await Wreck.request('GET', url, options)
} catch (error) {
breaker.recordFailure() // no response at all
throw error
}
breaker.recordSuccess() // any response, whatever its status
环境变量
当消费者不直接设定值时
| 变量 | 用于 |
|---|---|
SERVICE_NAME | logger.serviceName |
SERVICE_VERSION | logger.serviceVersion |
AWS_REGION | AWS STS 区域,用于服务符 |
AWS_ENDPOINT_URL_STS | AWS STS 端点覆盖(lis-dev的假 STS) |
在CDP上,平台设置了这些. 在Lis-dev中,由作曲文件设置.
先决条件
- 节点.js 24(见
.nvmrc,使用时nvm use(中文(简体) ) - 对照一个消费的应用程序检查更改: 净值 一次性设置完成
设置
发展
nvm use
npm install
测试
无法安装工具 npm install测试 维特。 。 。 .
正在发展中
这是一个库,所以它没有自己的服务器. 尝试改变一个消费应用 没有 发布, 将本地副本链接到 lis- dev 堆栈 :
cd lis-dev
.bin/sideload link hubs/infra-core # every installed copy now points at this repo
.bin/sideload up front-office # optional: run a consumer locally with hot reload
.bin/sideload unlink hubs/infra-core # when done
正在测试
npm test # unit tests
npm run test:coverage # with coverage
npm run lint # ESLint
npm run format:check # Prettier
在释放出一个变化之前,还要对连接包进行每个消耗回波的测试.
管道
GitHub 动作中运行的构建、版本和出版(.github/workflows)使用蛋糕脚本(*.cake:
- 将请求拉到
main: 校验(格式、林特、测试),声纳分析,版本检查 - 推到一个
feature/或者说hotfix/分支: 预发版本和标签 - 合并到
main: 释放标签,然后发布到 无
版本来自git标签 (SemVer). 合并后, 等待出版工作完成后, 才将套件撞入消耗回购中 .
分支政策
Repo采用干线开发. 分行从 main 并命名分支:
feature/LREG-<ticket>-<short-kebab-description>hotfix/LREG-<ticket>-<short-kebab-description>
LREG 必须是大写,因为 GitHub 规则拒绝其他分支名称。 重置为 main
而不是合并 main 进去.
协助这一项目
- 跟着 Defra软件开发标准。 。 。 .
npm install设置一个承诺前钩子(Husky),运行安全审计,格式检查和lint.- 打开拉动请求
main使用 PR 模板。 CI必须通过而声纳质量门在合并前必须是绿色.
许可证
本资料系根据下列公开政府规定公布:
http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3 互联网档案馆的存檔,存档日期2013-12-21
在使用此信息时, 您的产品和应用程序中引用以下的归属声明 MUST .
载有根据开放政府许可证颁发的公共部门信息v3
关于许可证
开放政府许可证(OGL)由陛下文具办公室(HMSO)的主计长制定,使公共部门的信息提供者能够根据共同开放许可证许可其信息的使用和再使用.
它旨在鼓励自由和灵活地使用和再使用信息,仅附带一些条件.