首页 文章 精选 留言 我的

精选列表

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

spring cloud构建互联网分布式微服务云平台-服务网关zuul

1.Zuul是什么 微服务场景下,每一个微服务对外暴露了一组细粒度的服务。客户端的请求可能会涉及到一串的服务调用,如果将这些微服务都暴露给客户端,那么会增加客户端代码的复杂度。 参考GOF设计模式中的Facade模式,将细粒度的服务组合起来提供一个粗粒度的服务,所有请求都导入一个统一的入口,那么整个服务只需要暴露一个api,对外屏蔽了服务端的实现细节,也减少了客户端与服务器的网络调用次数。这就是api gateway。 有了api gateway之后,一些与业务关系并不大的通用处理逻辑可以从api gateway中剥离出来,api gateway仅仅负责服务的编排与结果的组装。 Spring Cloud Netflix的Zuul组件可以做反向代理的功能,通过路由寻址将请求转发到后端的粗粒度服务上,并做一些通用的逻辑处理。 2.Zuul 能做什么 Zuul可以通过加载动态过滤机制,从而实现以下各项功能: 验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。 审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。 动态路由: 以动态方式根据需要将请求路由至不同后端集群处。 压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。 负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。 静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。 多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。 3.Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制。Filter的生命周期有4个,分别是“PRE”、“ROUTING”、“POST”、“ERROR”,整个生命周期可以用下图来表示。 Zuul大部分功能都是通过过滤器来实现的,这些过滤器类型对应于请求的典型生命周期。 PRE: 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。 ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。 POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。 ERROR:在其他阶段发生错误时执行该过滤器。 除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。Zuul中默认实现的Filter 4.怎么使用Zuul Spring Cloud Zuul路由是微服务架构的不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。 下面我们通过代码来了解Zuul是如何工作的 1.简单使用1、添加依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> 引入spring-cloud-starter-zuul包 2、配置文件 spring.application.name=gateway-service-zuul server.port=8888 #这里的配置表示,访问/it/** 直接重定向到http://www.ityouknow.com/** zuul.routes.baidu.path=/it/** zuul.routes.baidu.url=http://www.ityouknow.com/ 3、启动类 @SpringBootApplication @EnableZuulProxy public class GatewayServiceZuulApplication { public static void main(String[] args) { SpringApplication.run(GatewayServiceZuulApplication.class, args); } } 启动类添加@EnableZuulProxy,支持网关路由。史上最简单的zuul案例就配置完了。

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

使用.NET Core搭建分布式音频效果处理服务(七)使用Docker压榨性能极限

Docker相信很多朋友都使用过,做微服务比虚拟机还好用。 需要安装的一些东西 ffmpeg: docker pull ffmpeg dotnet: docker pull dotnet 默认全是latest最新即可,具体怎么配置网上搜索一下即可。 调用用REST? 还是用RPC? 微服务之间的接口调用通常包含两个部分,序列化和通信协议。常见的序列化协议包括json、xml、bytes等;通信比较流行的是http、soap、websockect,RPC通常基于TCP实现,常用框架例如dubbo,netty、thrift。 REST:严格意义上说接口很规范,操作对象即为资源,对资源的四种操作(post、get、put、delete),并且参数都放在URL上。 RPC:即我们常说的远程过程调用,就是像调用本地方法一样调用远程方法,通信协议大多采用二进制方式。 一般来说,对内选择rpc,因为他是直接基于TCP/IP协议通讯,性能要好很多。对外选择REST,因为他是更规范的、更标准的、更通用的、更简单的。 但是对于追求较高性能的RPC,会消耗额外很多成本,因此有时候对内一般也采用REST。 因此,笔者为了偷懒o(∩_∩)o ,在这个项目中选择REST,而抛弃RPC那臃肿的调用方式。 发布你的应用 dotnet 已经完全可以跨平台,但是如果直接用bin下面将文件夹拷贝到指定的地方,那么你将得到无数抓狂的错误,这是因为netcore和 net framewor本身的不同而造成,前者提供的是基础平台、让使用者自行去开发和扩展相应模块、且开源,而后者是所有东西都已经为你打包到他的集合中去了,你只管调用NET系统根目录中相应的库即可。 比如你需要发布到linux平台,进入你的项目主目录。执行: dotnet publish -r linux-x64 注意:从dotnet core 2.1开始,发布的时候已经不再需要先还原源码包(dotnet restore)。 进入到publish文件夹(一般在bin下),你会发现多了一些runtime库和一些你根本就没引用的库,这样才能有效的在其他操作系统上直接运行。 运行你的应用 你可以通过主机docker命令并附加子命令来运行docker内的dotnet程序,例如这样: docker run -dit \ -p 50532:80 \ -v /home/dotnet/Service:/wwwroot \ -w /wwwroot \ --restart always \ --name dotnet_service \ 6d25f57ea9d6 \ dotnet Service.Web.Api.dll -p:内外端口映射 -v:内外路径映射 -w:工作目录 6d25f....:你的dotnet镜像名称。 但笔者启动的程序需要附带大量的参数,而且不喜欢这样通过docker宿主进行命令输入,启动中有没有报错不能及时反馈(docker启动镜像返回的是一组hash代码,不会返回程序的的任何启动信息,需要通过docker log查阅),这样就变成如下操作: 进入在docker中的dotnet容器(成功运行镜像后都会成为一个容器),找到与你项目相关的主程序集文件,例如笔者是Service.Web.Api.dll,执行dotnet Service.Web.Api.dll(当然你也可以附带一大堆的启动参数,例如笔者这样)便可以运行这个项目。 dotnet Service.Web.Api.dll --ASPNETCORE_ENVIRONMENT=Development --ASPNETCORE_URLS=http://localhost:5052 --USE_CONTENTS_DIRECTORY=/home/netcore.MicroService/src/Service.Web.Api 小技巧:linux上面SSH相信大家有耳熟能详,但是一旦关闭控制台,运行的后台也将随之关闭,我们可以通过安装screen建立一个虚拟子屏幕,以保证shell程序在后台能一直运行下去。 保存你的netcore容器到镜像 如果我们需要在一台服务器上面建几十个docker容器,每一个都像上面那样进行一步一步的手动输入,那不是要崩溃... 我们保存一个已经在运行的容器,修改他子程序的运行参数,例如修改映射端口号,就可以实现快速的多个相同镜像的目的。使用命令: docker commit c16378f943fe service_media c1637...:这是笔者这边已经在运行的容器实例。 接下来再执行“运行你的应用”中的命令,将外部映射端口改成你想要的端口号,不断的重复这个操作,即可在同一台服务器上运行多个实例。 为何要选择docker进行实例运行 有的朋友也许不明白为何要这样做重复的操作,直接用dotnet自带的宿主,复制多条相同的命令,修改端口号一样也能达到如上的需求。 是的,这样的确也可以在同一台服务器上运行多个主机宿主实例,但是,他们并没有隔离。 对,就是这个词语----隔离: 说到这个词语可以牵涉一堆专业术语,而笔者又不想太多去复制太官方的东西,喜欢用白话文介绍自己所理解的内容。 当所有的子程序都运行在主机(非docker)下,内存分配,IO读取,系统底层调用等等一些处理,都会交给主机操作系统执行,这样会存在一定的风险。而docker虽然运行在主机之上,可他却有一套自己的底层进行处理,这样带来第一层隔离,其次,运行在docker容器内的程序,容器本身也是一个操作系统,不外乎是被建立镜像的时候将操作系统进行了大范围的瘦身,只保留该TAG需要的LIB就行,这样又做了一层隔离。 具体详细的隔离架构,朋友们可网上搜一搜,很多的。 运行多个docker dotnet core镜像 上面噼里啪啦的说了一大堆,其实就是一张图片就解释的事情: 笔者用了三台服务器做处理服务,每台上面运行相同的docker实例32个,总共3*32=96个实例(全傻瓜式的水平扩展),通过客户端模拟100个请求,得到结论如下: 反而比单机模拟6台服务器性能降低了3%-6%,但是: 1:单机一次请求是8个,而在该系统测试中,一次请求是100个。 2:单次时间变长,是因为服务器的U比本地测试的U的主频低,但是核心却是本地U的4倍。 这样一来,其实整体性能会随着服务器的数量的添加而增加,根据业务需求而定吧,就说目前某度云的视频转换最高请求也就是几千左右,如果真有那个量级,傻瓜式的增加服务器就行了。 本系列完,感谢阅读

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

Spring Cloud Spring Boot mybatis分布式微服务云架构(七)开发Web应用(1)

静态资源访问在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。 默认配置Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static /public /resources /META-INF/resources 举例:我们可以在src/main/resources/目录下创建static,在该位置放置一个图片文件。启动程序后,尝试访问http://localhost:8080/D.jpg。如能显示图片,配置成功。 渲染Web页面在之前的示例中,我们都是通过@RestController来处理请求,所以返回的内容为json对象。那么如果需要渲染html页面的时候,要如何实现呢? 模板引擎在动态HTML实现上Spring Boot依然可以完美胜任,并且提供了多种模板引擎的默认配置支持,所以在推荐的模板引擎下,我们可以很快的上手开发动态网站。 Spring Boot提供了默认配置的模板引擎主要有以下几种: Thymeleaf FreeMarker Velocity Groovy Mustache Spring Boot建议使用这些模板引擎,避免使用JSP,若一定要使用JSP将无法实现Spring Boot的多种特性,具体可见后文:支持JSP的配置 当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。当然也可以修改这个路径,具体如何修改,可在后续各模板引擎的配置属性中查询并修改。 Thymeleaf Thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于Apache License 2.0许可,由Daniel Fernández创建,该作者还是Java加密库Jasypt的作者。 Thymeleaf提供了一个用于整合Spring MVC的可选模块,在应用开发中,你可以使用Thymeleaf来完全代替JSP或其他模板引擎,如Velocity、FreeMarker等。Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这些标签属性就会在DOM(文档对象模型)上执行预先制定好的逻辑。 示例模板: <table> <thead> <tr> <th th:text="#{msgs.headers.name}">Name</td> <th th:text="#{msgs.headers.price}">Price</td> </tr> </thead> <tbody> <tr th:each="prod : ${allProducts}"> <td th:text="${prod.name}">Oranges</td> <td th:text="${#numbers.formatDecimal(prod.price,1,2)}">0.99</td> </tr> </tbody> </table> 可以看到Thymeleaf主要以属性的方式加入到html标签中,浏览器在解析html时,当检查到没有的属性时候会忽略,所以Thymeleaf的模板可以通过浏览器直接打开展现,这样非常有利于前后端的分离。 在Spring Boot中使用Thymeleaf,只需要引入下面依赖,并在默认的模板路径src/main/resources/templates下编写模板文件即可完成。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>

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

Spring Cloud Spring Boot mybatis分布式微服务云架构(八)开发Web应用(2)

在完成配置之后,举一个简单的例子,在快速入门工程的基础上,举一个简单的示例来通过Thymeleaf渲染一个页面。 @Controller public class HelloController { @RequestMapping("/") public String index(ModelMap map) { // 加入一个属性,用来在模板中读取 map.addAttribute("host", "http://blog.didispace.com"); // return模板文件的名称,对应src/main/resources/templates/index.html return "index"; } } <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8" /> <title></title> </head> <body> <h1 th:text="${host}">Hello World</h1> </body> </html> 如上页面,直接打开html页面展现Hello World,但是启动程序后,访问http://localhost:8080/,则是展示Controller中host的值:http://blog.didispace.com,做到了不破坏HTML自身内容的数据逻辑分离。 更多Thymeleaf的页面语法,还请访问Thymeleaf的官方文档查询使用。 Thymeleaf的默认参数配置 如有需要修改默认配置的时候,只需复制下面要修改的属性到application.properties中,并修改成需要的值,如修改模板文件的扩展名,修改默认的模板路径等。 # Enable template caching. spring.thymeleaf.cache=true # Check that the templates location exists. spring.thymeleaf.check-template-location=true # Content-Type value. spring.thymeleaf.content-type=text/html # Enable MVC Thymeleaf view resolution. spring.thymeleaf.enabled=true # Template encoding. spring.thymeleaf.encoding=UTF-8 # Comma-separated list of view names that should be excluded from resolution. spring.thymeleaf.excluded-view-names= # Template mode to be applied to templates. See also StandardTemplateModeHandlers. spring.thymeleaf.mode=HTML5 # Prefix that gets prepended to view names when building a URL. spring.thymeleaf.prefix=classpath:/templates/ # Suffix that gets appended to view names when building a URL. spring.thymeleaf.suffix=.html spring.thymeleaf.template-resolver-order= # Order of the template resolver in the chain. spring.thymeleaf.view-names= # Comma-separated list of view names that can be resolved. 支持JSP的配置Spring Boot并不建议使用,但如果一定要使用,可以参考此工程作为脚手架:JSP支持

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

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部分的功能。

用户登录
用户注册