首页 文章 精选 留言 我的

精选列表

搜索[VPU驱动],共10000篇文章
优秀的个人博客,低调大师

在Play with Kubernetes平台上以测试驱动的方式部署Istio

Kubernetes and Istio 翻译一篇 Istio 部署教程,原文链接:test-drive-your-first-istio-deployment-using-play-with-kubernetes-platform-cloud-computing 作为一名全栈开发,假如最近花了不少时间开发应用,肯定已经理解了微服务架构下要面临的一系列全新挑战。尽管应用已经从庞大的单体应用转变成了开发更快、弹性更好、更小也更聚焦的微服务,但现实是,开发者需要开始操心将这些服务集成到分布式系统中的问题了,包括服务发现、负载均衡、注册、容错、监控、路由、兼容和安全等。 让我们更详细的拆解微服务架构下开发和运维面临的挑战吧。先来看看第一代简单的 Service Mesh 场景,如下图所示,服务 A 要和 服务 B 通信,没有采用直接通信的方式,请求是通过 NGINX 路由的。NGINX 从 Consul(服务发现工具)查找路由,并在收到 HTTP 502 响应时,自动重试。 图 1.0 - 一代 Service Mesh 图 1.1 - 服务增多时,级联失败演示 但随着微服务架构的到来,服务数量的增长一发不可收拾,下面列出的是开发和运维团队遇到的问题: 如何让日益增长的微服务们互联? 如何为微服务提供负载均衡? 为微服务提供基于角色的路由; 如何控制微服务的出口流量,如何实现灰度发布? 如何控制不断增长的微服务的复杂度? 如何用富路由规则实现细粒度的流量控制? 实现流量加密、服务到服务的鉴权和强身份声明的挑战 简而言之,虽然你可以在应用和网络中间件中开启服务发现和重试机制,但实际上,想让服务发现正常工作是非常困难的。 初试 Istio Service Mesh Service Mesh 是 2018 年度最火热的流行词之一,它是微服务的可配置基础架构层,负责微服务应用间的交互,service mesh 让微服务实例间的交互更灵活、可靠和快速。Mesh 层提供了服务发现、负载均衡、加密、鉴权和验证,支持熔断机制等其他能力。 Istio 是完全开源的,可透明的部署在已有的分布式应用上。Istio 1.0 版本在上个月发布,已经生产环境可用。Istio 完全由 Go 语言编写,提供成熟的 API 接口可以接入到任何日志平台、遥测和策略系统中。Istio 在 GitHub 上发布,对系统的性能影响很小,丰富的特性让你可以顺利、高效的运行分布式微服务架构,并提供统一的保护、连接和监控方法。 图 1.2 Istio 功能 Istio 对系统的影响很小,它在 GitHub 上发布,上个月,Istio 1.0 版本已经发布,并且生产环境可用。 Istio 能带来什么好处呢? Istio 提供服务的连接、保护、控制和观测能力。 减少服务部署的复杂度,减轻部署团队的压力。 在无需修改应用代码的前提下,为开发和开发运维提供了细粒度的流量可视化和控制。 为 CIO 提供了帮助全企业安全实施和合规型需求的必要工具。 在 service mesh 层提供了统一的行为监测和运营控制。 Istio 让为服务网络提供 HTTP、gRPC、Web Socket 和 TCP 流量的自动负载均衡变的轻松。 提供了细粒度的流量行为控制,包括:富路由规则、重试、故障转移和失败注入。 支持插件化的策略控制层和配置 API,支持访问控制、流量限制和配额。 Istio 为集群内的全部流量提供自动的度量、日志、追踪,包括进群的入口和出口。 以强身份验证和鉴权的方式,提供了集群内安全的服务间通信。 如何想深入 Istio 架构,我强烈推荐 Istio 官方网站(https://istio.io/zh)。 image 开始演示!!! 在这篇文章中,我将展示如何在 Play with Kubernetes(PWK)中免费部署 Istio,这是个由 Docker 提供的实验网站,是让用户在几秒钟内跑起来 Kubernetes 集群的试验环境。PWK 提供了在浏览器中使用免费 CentOS Linux 虚拟机的体验,实际上是 Docker-in-Docker(DinD)技术模拟了多虚拟机/PC 的效果。 打开 https://labs.play-with-k8s.com/,访问 Kubernetes Playground。 image 点击 "Login" 按钮,以 Docker Hub 或 GitHub ID 登陆。 image 完成本教程,你将获得自己的实验环境。 添加第一个 Kubernetes 节点 点击左侧的 "Add New Instance" 来构建你的第一个 Kubernetes 集群节点,自动命名为 "node1",每个节点都预装来 Docker 社区版(CE)和 Kubeadm。这个节点将成为集群的主节点。 image 启动主节点 用如下脚本初始化主节点(node1)来启动 Kubernetes 集群,复制该脚本内容到文件 bootstrap.sh,并执行命令添加可执行权限:chmod +x bootstrap.sh image 执行脚本时,作为初始化的一部分,kubeadm 会写入几个必要的配置文件、设置 RBAC 并部署 Kubernetes 控制平面组件(例如 kube-apiserver、kube-dns、kube-proxy、etcd 等)。控制平面组件以 docker 容器形式部署。 image 复制上面的 kubeadm join token 命令,留作下步使用,此命令用来在集群中加入其他节点。 添加从节点 点击 "Add New Node" 添加新的从节点 image 验证集群状态 image 验证运行的 Pods image 安装 Istio 1.0.0 Istio 部署在单独的 Kubernetes 命名空间里:istio-system,我们过后再来验证。现在,复制如下内容到文件,命名为 install_istio.sh,并保存。添加可执行权限,运行以安装 Istio 和相关工具。 image 屏幕上应显示如下内容: image 如上所示,默认会安装 Prometheus、ServiceGraph、Jaeger、Grafana 和 Zipkin。 请注意:运行该脚本时,可能会报如下错误: unable to recognize "install/kubernetes/istio-demo.yaml": no matches for admissionregistration.k8s.io/, Kind=MutatingWebhookConfiguration 这是正常的,命令一执行完,可在页面的中央看到一长串展示的端口。 image image 验证服务 image 暴露服务 要暴露 Prometheus、Grafana 和 服务图标服务,需要先删除已有的服务,用 NodePort 替换 ClusterIP,用实例页顶端展示的端口访问服务(如下所示)。 image image 点击 "30004" 访问 Grafana 页,点击 "30003" 访问 Prometheus 页。 image image 可以如下图所示,选择必要配置查看 Prometheus 度量: image 在 Grafana 页,添加 Prometheus 数据源,并确认 Dashboard 已经运行。 image 恭喜!你已经将 Istio 部署在 Kubernetes 集群上了,K8S playgroud 上已经安装的服务包括: Istio Controllers,以及相关 RBAC 规则 Istio 定制资源定义 Prometheus 和 Grafana 监控系统 Jeager 分布式追踪系统 Istio Sidecar 注入程序(下一节我们再来仔细看看) 安装 Istioctl Istioctl 是 Istio 的命令行配置工具,可以用来创建、查询、修改和删除 Istio 系统的配置资源。 image 部署 BookInfo 应用示例 Istio 已经安装并验证过了,可以在上面部署示例应用 BookInfo 了,这是一个简单的书店模拟应用,由四个服务组成:网站首页、书籍信息、评论(几个特定的版本有评论服务)和评分,全部由 Isito 管理。 部署 BookInfo 服务 image 定义入口网关 image 验证 BookInfo 应用 image image 通过 URL 访问 image 现在应该可以看到 BookInfo 示例了: image 希望本部程能帮你顺利的在 Kubernetes 上部署 Istio。下一篇博客,我将深入 Isito 的内部架构、流量控制、权限和遥测等细节。

优秀的个人博客,低调大师

NLPIR语义分词技术给自然语言处理带来新驱动

随着信息的快速速增长,让搜索引擎成了人们查找信息的首要工具。如今在中文搜索引擎领域,国内搜索引擎已经同国外搜索引擎效果上相差不大了。能形成现在这样的局面,是有一个重要的原因:英文和中文两种语言自身的书写方式不相同,其中在计算机涉及的技术就是中文分词技术。 分词技术发展至今,也已经有十几年的历史。目前在中文分词领域,已经有很多成熟的分词技术。中文是由连续文字组成,缺乏有效的间隔,虽然有句、段分隔,但在进行机器语言学习、文本语义理解分析过程中都需以词组为最小单位的。因此实现中文分词相对英语来讲,更加的复杂、困难。这其中对于计算机涉及的技术就是中文分词技术。 中文分词不仅是各种中文信息处理技术中使用最广泛的手段,也是信息检索和搜索引擎必不可少的基础性工作。现有的中文分词方法有很多,它们以字符串匹配、统计模型、理解、路径以及语义等

优秀的个人博客,低调大师

IDDD 实现领域驱动设计-一个简单的 CQRS 示例

学习架构知识,需要有一些功底和经验,要不然你会和我一样吃力,CQRS、EDA、ES、Saga 等等,这些是实践 DDD 所必不可少的架构,所以,如果你不懂这些,是很难看懂上篇所提到的 CQRS Journey 和 ENode 项目,那怎么办呢?我们可以从简单的 Demo 一点一滴开始。 代码地址:https://github.com/yuezhongxin/CQRS.Sample 说明:一张很丑陋的图 CQRS.Sample 所描述的一个流程是 SendMessage(发消息),也就是之前 MessageManager 中的一个业务示例,这个业务流程用到 CQRS 示例中,可能会有些不太准确,或者是有些牵强,但我主要的目的是想做一次 Commond->Event 的过程,熟悉它们到底是怎么交互的?所以,你查看代码的时候,尽量忽略这个业务流程,当然,如果你有针对这个业务流程更好的具体应用,我是非常欢迎交流。 首先,我们根据上面的流程图一步一步进行,UI 创建一个 Commond,然后交给 CommandBus 进行 Send(发送),也就是下面这段代码: var commond = new SendMessageCommond() { Title = "this is title", Content = "this is content", SenderLoginName = "this is senderLoginName", RecipientDisplayName = "this is recipientDisplayName" }; var commandBus = IocContainer.Default.Resolve<CommandBus>(); commandBus.Send(commond); 项目中所有的类型映射都是通过 IoC 进行注入,ICommandBus 接口定义为:void Send<TCommand>(TCommand cmd) where TCommand : ICommand;,CommandBus 的实现主要是在 Send 方法中,解析ICommandHandler<TCommand>注入的类型对象,然后调用 ICommandHandler 接口定义的 Handle 方法,传入 TCommand 参数对象。 SendMessageCommond 的定义很简单,主要是一些来自 UI 的参数,所以,我们一般会定义一些属性字段,有时候我们会进行数据验证,可以使用 Validate,方法签名是:IEnumerable<ValidationResult> Validate(ValidationContext validationContext),不过需要继承 IValidatableObject 接口,这样我们就可以在 MVC View 前端进行输出验证结果,使用起来非常方便,SendMessageCommond 继承一个无实现的 ICommand 接口,主要用来约束类型,SendMessageCommond 对应 SendMessageCommondHandler,实现代码: public class SendMessageCommondHandler : ICommandHandler<SendMessageCommond> { public void Handle(SendMessageCommond command) { var sender = VerifySenderService.Verify(command.SenderLoginName); var receiver = VerifyReceiverService.Verify(command.RecipientDisplayName); var message = new Message(command.Title, command.Content, sender, receiver); message.Send(); } } CommondHandler 的功能有点类似于经典分层架构中的 Application(应用层),从它的具体实现中,我们就可以看出领域到底在做哪些工作,它的主要工作就是协调这些工作的流程,领域中的代码我就不贴了,这里我简单说明一下,在之前的 SendMessage 实现中,设计了一个 SendMessageService 领域服务,里面主要进行的工作是验证收发件人,以及消息是否符合规则,后来我就想,SendMessageService 和它实际进行的工作不相符,发消息所蕴含的实际业务意义,我也一直没有想明白,但是在具体实现中,发消息所做的工作是验证,那验证是不是发消息真正的业务含义呢?所以,稀里糊涂就有了上面的代码,VerifySenderService 和 VerifyReceiverService 是用来验证收发件人信息的,成功的话就返回一个 Contact 对象,具体的验证逻辑可以查看下实现代码。 下面说一下message.Send();,这个可能有很大的问题,在 CQRS Journey 项目中,有很多类似于这样的操作,就是在 CommondHandler 中,创建一个聚合根对象,然后执行聚合根中的一个行为,比如我搜刮的order.Confirm(),订单可以提交自己吗?消息可以发送自己吗?这样做的含义是什么?其实我也搞不太清楚,在 Message 聚合根中的 Send 方法中,主要是事件的发布, public void Send() { eventBus.Publish(new MessageSentEvent(this)); } 先抛开 Send 的合理性,看下 EventBus 是如何 Publish 的?我的实现中和 CommondBus 很相似,但我觉得可能有些问题,Commond 和 CommondHandler 是一一对应关系,我们知道事件发布和事件订阅是一对多关系,也就是说一个事件可能有很对的订阅者,这些订阅者所处理的过程可能会有些不同,比如用户注册的一个事件,可能会有邮件通知订阅者,也可能会有统计数据更新订阅者,在 CQRS Journey 项目中,EventBus 的 Publish 大概是这样实现的: public void Publish(Envelope<IEvent> @event) { var message = this.BuildMessage(@event); this.sender.Send(message); } private Message BuildMessage(Envelope<IEvent> @event) { using (var payloadWriter = new StringWriter()) { this.serializer.Serialize(payloadWriter, @event.Body); return new Message(payloadWriter.ToString(), correlationId: @event.CorrelationId); } } 而我的实现则是和 CommondBus 一样,都是用 IoC 注入的,所以肯定有问题,我们来看下 MessageSentEventHandler 中的代码: public class MessageSentEventHandler : IEventHandler<MessageSentEvent>, IEventHandler<MailSentEvent> { private IEventBus eventBus; public void Handle(MessageSentEvent @event) { eventBus = IocContainer.Default.Resolve<IEventBus>(); new MessageRepository().Save<Message>(@event.Message); eventBus.Publish(new MailSentEvent { Title = @event.Message.Title, Content = @event.Message.Title, }); } public void Handle(MailSentEvent @event) { var mailMessage = new System.Net.Mail.MailMessage(); mailMessage.Subject = @event.Title; mailMessage.Body = @event.Content; mailMessage.IsBodyHtml = true; mailMessage.BodyEncoding = System.Text.Encoding.UTF8; mailMessage.Priority = System.Net.Mail.MailPriority.Normal; System.Net.Mail.SmtpClient smtpClient = new System.Net.Mail.SmtpClient(); Task.Run(() => { smtpClient.SendAsync(mailMessage, mailMessage.Body); }); } } 消息发送之后,进行持久化操作,然后再进行邮件通知,这样一整个 SendMessage 的流程就走完了。 这个流程中,只有 CQRS 的 Commond,并没有 Query,也没有 ES、Saga 的概念,主要是它们太深奥了,我搞不来。CQRS.Sample 只是一个简单的示例,发消息的业务含义所表达的可能不是很准确,本来是想用用户注册、订单提交业务示例,但还是想想用发消息进行尝试下,除去 EventBus 的实现有问题,CQRS 的简化版基本上都能表现出来了。 另外,从简单分层架构改造成 CQRS 确实有很多挑战,但有时候想想,领域模型都设计的有问题,那用什么架构实现都毫无意义,如果在现有的项目中,你发现经典分层架构实现起来有很多别扭的地方,比如 Domain 引用了 DTO,你可以尝试先把 Repositories 进行分离下,创建一个 Query 项目,把一些无业务逻辑的查询发到里面(主要是应用层调用的),这样使 Repositories 更加简化,如果可以简化成只有一个 GetById 方法,那么就达到 CQRS 的标准了,因为 Repositories 的接口定义在领域层,因为 Query 项目的分离,所以,Domain 就可以去除 DTO 的引用了,应用层也就直接调用 Query,这只是一个中和方案。 领域模型需要一点一滴设计,架构也需要一点一滴设计,但后者需要建立在前者的基础上。 一个对我非常有帮助的 CQRS 系列(初级): CQRS实践(1): 什么是CQRS CQRS实践(2): Command的实现 CQRS实践(3): Command执行结果的返回 CQRS实践(4): 领域事件 本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/iddd-cqrs-samlpe.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册