首页 文章 精选 留言 我的

精选列表

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

(4opencv)OpenCV PR 成功的收获和感悟

2018-09-12,第一次对OpenCVPR成功 https://github.com/opencv/opencv/pull/12206 《findinnercircleofcontourbyusingpointPolygonTest》 总的来说,参加PR绝对是一件消耗时间精力(特别对于新手),同时收获非常巨大的事情。 下面,分几个方面对这次工作进行总结。 一、价值和 收益 1、获得名誉、结交高手 这是隐性的收获,但却是绝对重要的收获。在anwseropencv上面的交流,在githup里面提交pr和issue,你所交流的这些人,都是这个方向最为优秀的工程师,和他们进行交流,能够有很多收益。 2、项目理解 正是因为要向项目提交代码,强迫自己必须从结构、细节等多个方面去理解这个项目,绝不是仅够用就可以。这就使得你对项目的理解能够更上层次,进一步地理解项目内容; 更深入的理解,带来的结果,显而易见是在使用的时候能够更得心应手。“你对你所做的了解的越多,则越能够做得更好” 3、代码规范; 我们都说cleanCode,但是你写出来的到底是不是cleanCode,只有一个笼统的概念。OpenCV通过自动构建,你必须按照它的规范来写(严格到多一个空格,或者使用了tab而不是四个空格都不可以),这就要求你必须尽可能地用规范 代码编写,养成良好习惯。【附录我会给出一个被拒绝的具体情况】 同时,owner会提示你正确的代码是怎样的(因为他拒绝你总要给个合适理由),往往这些提示都是非常精准的。就是通过这个过程,能够让我写出高质量的代码; 二 、成功pr的来源 1、选题必须要恰当 简单的来说,绝对不能为了pr而去pr,而是要在自己的使用OpenCV的过程中,确实发现的问题、确实发现的更好的算法,那么通过pr就能够帮助你将初步的想法变成一套正规的解决方案。 2、代码必须符合规范 相比较逻辑错误,由于代码规范问题导致的错误更容易成为你的绊脚石; 3、把我节奏,注重效率 pr最终还是和人的沟通,那么要注意管理员的活跃时间,以及和他们进行有理有节的“斗争”。 三 、关键的工具 1、github desktop 2、www.github.com 3、buildboot等自动化工具,要首先让代码在本地能够通过包括“代码格式”的审核,然后再上传上去。 PR,特别是对OpenCV这样的伟大项目的PR,应该说非常有价值意义。值得投入时间进行研究,尽快提高PR成功的可能。 p.s opencv的pr是自动编译的,如果编译不通过,肯定不会被merge,首先要过的就是merge这关 为了稳定,opencv不允许warning,这也是为了编写高质量代码 像这种warning,可能平时写程序的时候,完全不会在意,但是build就不通过。这样对代码质量提出更高要求。 只要告诉我哪里错了,就没有问题。 语言习惯错误 历史版本问题 之前的红的好像过去了 空格都能看出来,厉害 这个时候,管理员介入了,出现了更多错误 来自为知笔记(Wiz) 目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

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

【微服务No.4】 API网关组件Ocelot+Consul

介绍: Ocelot是一个.NET API网关。该项目针对的是使用.NET运行微服务/面向服务架构的人员,他们需要一个统一的入口进入他们的系统。然而,它可以处理任何说HTTP并在ASP.NET Core支持的任何平台上运行的任何东西。 Ocelot是一组按特定顺序的中间件,Ocelot操纵HttpRequest对象进入由其配置指定的状态,直到它到达请求生成器中间件,在该中间件中创建HttpRequestMessage对象,该对象用于向下游服务发出请求。提出请求的中间件是Ocelot管道中的最后一件事。它不叫下一个中间件。来自下游服务的响应存储在每个请求作用域存储库中,并在请求返回到Ocelot管道时进行恢复。有一件中间件将HttpResponseMessage映射到HttpResponse对象上,并返回给客户端。这基本上是与其他一些功能。 Ocelot只能用于.NET Core,并且目前已经构建到netstandard2.0。所有下面我们使用.NET Core 2.1做演示。 创建一个基本示例: 首先我们创建一个.NET Core 2.1空项目。 当然我们还是要先引用的拉,Nuget命令行:Install-Package Ocelot 配置:添加一个json文件实现最基本的配置: { "ReRoutes": [], "GlobalConfiguration": { "BaseUrl": "urladdress" } } 这里最重要的是BaseUrl。Ocelot需要知道它正在运行的URL,以便执行标题查找和替换以及某些管理配置。当设置这个URL时,它应该是客户端将看到的Ocelot运行的外部URL。 然后我们将刚才的配置文件加入到ASP.NET Core Configuration:Program.cs public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, builder) => { builder .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath) .AddJsonFile("ocelot.json"); }) .UseStartup<Startup>(); View Code 最后在添加服务以及设置中间件:Startup.cs public void ConfigureServices(IServiceCollection services) { services.AddOcelot();//添加ocelot服务 } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseOcelot().Wait();//设置所有的Ocelot中间件 app.Run(async (context) => { await context.Response.WriteAsync("Hello World!"); }); } } View Code 这些就是基本的所需编程代码。 配置文件的详细分析: Ocelot的主要功能是收取HTTP请求并将它们转发到下游服务。目前以另一个http请求的形式出现。Ocelot描述了将一个请求作为ReRoute路由到另一个请求。为了在Ocelot中获得任何工作,您需要在配置中设置ReRoute。 说道这里我们补充一下刚才写的json文件的两个根节点:ReRoutes和GlobalConfiguration。 ReRoutes:是一个数组,其中的每一个元素代表了一个路由,我们可以针对每一个路由进行以上功能配置,告诉Ocelot如何处理上游请求的对象。 GlobalConfiguration:全局配置,可以适当的节约配置,比如baseurl节点,服务发现配置。 这样我们就实现了通过配置文件可以完成对Ocelot的功能配置:路由、服务聚合、服务发现、认证、鉴权、限流、熔断、缓存、Header头传递等。 配置一个示例:下面这个配置信息就是将用户的请求 /ProductService/1转发到 localhost:8001/api/Test/1 { "ReRoutes": [ { "DownstreamPathTemplate": "/api/Test/{postId}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "127.0.0.1", "Port": 8001 } ], "UpstreamPathTemplate": "/ProductService/{postId}", "UpstreamHttpMethod": [ "Get", "Delete" ] } ], "GlobalConfiguration": { // "BaseUrl": "http://127.0.0.1:8887/" } } View Code DownstreamPathTemplate:下游方位url路径 DownstreamScheme:下游服务http schema DownstreamHostAndPorts:下游服务的地址,如果使用LoadBalancer的话这里可以填多项 UpstreamPathTemplate:上游也就是用户输入的请求Url模板 UpstreamHttpMethod:上游请求http方法,可使用数组:Get ,Delete等 好了这样就实现了一个基本的Ocelot网关的转发示例。 下面让我们来看一下效果吧: 首先我们运行起来webapi项目发布在8001端口。然后访问地址是:http://127.0.0.1:8001/api/Test/5 我们看到的结果是: 然后我们启动我们的网关服务;发布在端口8888下,根据以上配置我们可以看到方位地址为:http://127.0.0.1:8888/ProductService/5 然后同样的请求结果是: 这样我们就实现使用统一网关来访问不同的地址,以便我们以后实现微服务的分发部署,虽然是不是多个接口,但是我们给上游访问还是提供一个接口,我们内部实现访问该访问那个接口。 至于具体怎发布也可参考这篇文章:http://www.cnblogs.com/yanbigfeg/p/9198345.html 路由小知识: UpstreamHost=>"UpstreamHost": "baidu.com":上游主机 此功能允许您基于上游主机进行ReRoutes。这通过查看客户端使用的主机头来工作,然后将其用作我们用来识别ReRoute的信息的一部分。这样就是显示了只有在主机头值为baidu.com时才会匹配。 Priority=>"Priority": 0:优先级 此功能设置访问路由的优先级,假设在同一个路由下有多个路由,会根据优先级匹配优先级最高的,0是最低的。 Dynamic Routing:动态路由 这个主要是为了服务发现而实现的,在这种模式下,Ocelot将使用上游路径的第一个分段来查找服务发现提供商的下游服务。官网给出的大概配置效果: { "ReRoutes": [], "Aggregates": [], "GlobalConfiguration": { "RequestIdKey": null, "ServiceDiscoveryProvider": { "Host": "localhost", "Port": 8510, "Type": null, "Token": null, "ConfigurationKey": null }, "RateLimitOptions": { "ClientIdHeader": "ClientId", "QuotaExceededMessage": null, "RateLimitCounterPrefix": "ocelot", "DisableRateLimitHeaders": false, "HttpStatusCode": 429 }, "QoSOptions": { "ExceptionsAllowedBeforeBreaking": 0, "DurationOfBreak": 0, "TimeoutValue": 0 }, "BaseUrl": null, "LoadBalancerOptions": { "Type": "LeastConnection", "Key": null, "Expiry": 0 }, "DownstreamScheme": "http", "HttpHandlerOptions": { "AllowAutoRedirect": false, "UseCookieContainer": false, "UseTracing": false } } } View Code Ocelot实现多个端口的轮询: 以上实现的这个有什么用啊,单独发布了接口,然后使用另外一个接口去复制他吗?别急,这只是其中的一个基本使用,现在我们有了基本步骤,我们改一改,实现webapi发布两个接口,8001,8002.然后还使用网关地址访问,可以循环的访问到8001端口和8002端口。 说起来简单,做起来也简单,我们只需要在我们上面的配置上修改一下即可: { "ReRoutes": [ { "DownstreamPathTemplate": "/api/Test/{postId}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "127.0.0.1", "Port": 8001 }, { "Host": "127.0.0.1", "Port": 8002 } ], "UpstreamPathTemplate": "/ProductService/{postId}", "UpstreamHttpMethod": [ "Get" ], "LoadBalancerOptions": { "Type": "RoundRobin" } } ], "GlobalConfiguration": { // "BaseUrl": "http://127.0.0.1:8887/" } } View Code 启动两个端口: 重复请求网关两次结果: Ocelot+ Consul: 实现目标:启动服务发现然后模拟集群发布功能,实现发布端口8001,8002后,启动服务发现,然后配置Ocelot网关。实现访问统一接口可以轮询访问8001,8002,8001,8002,...这样。然后可以在添加8003,继续规则。 实现以上目标我们不需要该我们的示例代码,只需要修改配置json文件即可: { "ReRoutes": [ { "DownstreamPathTemplate": "/api/Test/{postId}", "DownstreamScheme": "http", "UpstreamPathTemplate": "/Product123Service/{postId}", "UpstreamHttpMethod": [ "Get" ], "ServiceName": "ProductService", "LoadBalancerOptions": { "Type": "RoundRobin" }, "UseServiceDiscovery": true } ], "GlobalConfiguration": { // "BaseUrl": "http://127.0.0.1:8887/" "ServiceDiscoveryProvider": { "Host": "localhost", "Port": 8500, "Type": "PollConsul", "PollingInterval": 100 } } } View Code 这个就是我们的服务功能: Ocelot允许您指定服务发现提供程序,并使用它来查找Ocelot正在将请求转发给下游服务的主机和端口。目前,这仅在GlobalConfiguration部分中受支持,这意味着将为所有的ReRoute使用相同的服务发现提供程序,以便在ReRoute级别指定ServiceName。 ServiceName:consul的服务名称 LoadBalancerOptions:使用的算法,目前有两种RoundRobin(轮询方式)和LeastConnection(最小连接) UseServiceDiscovery:是否启用服务发现功能true:为启动 ServiceDiscoveryProvider:配置服务发现的一些配置 Host:主机地址 Port:端口 PollingInterval:轮询的间隔时间,以毫秒为单位。并告诉Ocelot多久可以向Consul调用服务配置的更改 想要了解更多可以访问Ocelot官网:http://ocelot.readthedocs.io/en/latest/features/servicediscovery.html 系列目录: 微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例: 微服务——微服务的介绍和目录 微服务——【Consul】服务发现在windows下简单使用(一) 微服务——【polly】微服务故障处理库(二) 微服务——动态代理AspectCore的使用(三) 微服务——网关Ocelot+Consul实现集群轮询(四) 作者:YanBigFeg —— 颜秉锋 出处:http://www.cnblogs.com/yanbigfeg 本文版权归作者和博客园共有,欢迎转载,转载请标明出处。如果您觉得本篇博文对您有所收获,觉得小弟还算用心,请点击右下角的 [推荐],谢谢!

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

阿里云产品头条(2018年4月刊)

一、阿里云新产品发布 1、 自然语言处理 商业化发布(国内站)自然语言处理(Natural Language Processing)是为各类企业及开发者提供的用于文本分析及挖掘的核心工具,旨在帮助用户高效的处理文本,已经广泛应用在电商、文化娱乐、金融、物流等行业客户的多项业务中,取得了良好的效果。通过自然语言处理的API,可帮助用户搭建内容搜索、内容推荐、舆情识别及分析、文本结构化、对话机器人等智能产品,也能够通过合作,定制个性化的解决方案。 2、 数据集成 商业化发布(国内站)数据集成(Data Integration)是阿里集团对外提供的可跨异构数据存储系统的、可靠、安全、低成本、可弹性扩展的数据同步平台,为400+对数据源提供不同网络环境下的全量/增量数据进出通道。 3、 智能接入网关 正式公测 (国内站)

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

Junit4单元测试常见问题汇总

1.java.lang.IllegalStateException: Failed to load ApplicationContext 通常报这种的错误就是运行单元测试某一个方法失败,导致失败的是引用controller的service不全, 解决方案:在controller里所(引用)调用的所有service,也要同样在对应controller的单元测试类写全即可。 (controller类) (controller对应的单元测试类) 2.问题:单元测试模拟不了controller里的service方法的参数 解决方案:使用Mockito.isA()方法,它是实现给定类的对象参数。 (controller层) (单元测试层)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

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等操作系统。

用户登录
用户注册