首页 文章 精选 留言 我的

精选列表

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

Lemmy v0.15.1 发布,高性能自托管仿 Reddit 社区

Lemmy v0.15.1 现已发布。Lemmy 是一个 Rust 实现的类似于Reddit、Lobste.rs、Raddle 与 Hacker News 等网站的项目,用户订阅感兴趣的论坛、发布链接和讨论,可以进行点赞/点踩,并对它们发表评论。基于 Fediverse 标准,所有服务器可以联合,这意味着在一台服务器上注册的用户可以订阅任何其它服务器上的论坛,并且可以与在其它地方注册的用户进行讨论。 主要更新内容如下: 所需的电子邮件验证 管理员可以打开此功能,新用户需要验证他们的电子邮件。当前用户不必这样做。 注册申请 管理员现在可以选择让新用户填写申请以加入你的服务器。他们的顶部栏中有一个新面板,他们可以在其中批准或拒绝待处理的申请。 这与require_email字段一起使用。如果这也被打开了,那么只有在他们的电子邮件被验证后,才会显示申请。当他们被接受时,用户将收到一封电子邮件。 Closed / Private instances 实例设置现在包括一个私有实例选项,如果打开该选项,将只允许登录用户查看你的站点。 Temporary Bans 在禁止用户访问你的网站或社区时,版主现在可以选择给禁令持续天数。 允许被屏蔽用户的评论回复 过去,如果用户屏蔽了你,你将无法回复他们的公开帖子和评论。现在已修复,他们不会看到你的内容,但其他人可以。 详情可查看:https://github.com/LemmyNet/lemmy/releases/tag/0.15.1

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

架构方法论:如何自底向上推导应用逻辑?

点击阅读上篇:从方法到思维:什么是应用逻辑架构的正确姿势? 五 架构的基本约束 架构约束分成了基本约束和业务约束: 逻辑架构基本约束:是软件工程领域常见的各种软件设计原则。 逻辑架构的职责约束:是模块,子模块,模型的职责相关约束,尤其是核心的模型和核心主模块是在一定时间内是比较稳定的,所以此时对其定义它的约束范围是有助于这段时间内的研发的效率的。 各种架构的非业务功能性约束,如稳定性,性能,成本等等。 而本文讲到的约束基本是逻辑架构上约束,如果考虑业务约束,我们还必须要考虑我们的面向的客户是什么群体之类的约束,如果缺少这样的约束,在设计产品时可能会走偏。 5.1 常见的软件设计原则 单一职责原则(SCP)(参考 grasp 原则) 开闭原则(OCP) 子类替换原则 依赖倒置原则(DIP) 接口隔离原则(ISP) 组合聚合复用原则(CARP) 迪米特法则(L

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

随行付微服务之基于Zuul自研服务网关

随行付微服务之服务网关 微服务是时下最流行的架构之一,作为微服务不可或缺的一部分,API网关的作用至关重要。本文将对随行付微服务的API网关实践进行介绍。 API网关的作用 我们知道,在一个微服务系统中,整个系统被划分为许多小模块,客户端想要调用服务,可能需要维护很多ip+port信息,管理十分复杂。API网关作为整个系统的统一入口,所有请求由网关接收并路由转发给内部的微服务。对于客户端而言,系统相当于一个黑箱,客户端不需要关心其内部结构。 随着业务的发展,服务端可能需要对微服务进行重新划分等操作,由于网关将客户端和具体服务隔离,因此可以在尽量不改动客户端的情况下进行。网关可以完成权限验证、限流、安全、监控、缓存、服务路由、协议转换、服务编排、灰度发布等功能剥离出来,讲这些非业务功能统一解决、统一机制处理。 Zuul原理简介 随行付微服务API网关基于Netflix的Zuul实现。Netflix是实践微服务最成功的公司之一,他们创建并开源了一系列微服务相关的框架,Zuul便是用来实现网关功能的框架。Zuul的整体架构图如下: Zuul基于Servlet开发,ZuulServlet是整个框架的入口。Zuul的核心组件是Filter,Filter分为四类,分别是pre、route、post、error。pre-filter用来实现前置逻辑,route-filter用来实现对目标服务的调用逻辑,post-filter用来实现收尾逻辑,error-filter则在任意位置发生异常时做异常处理(此处应该注意,如果pre或route发生异常,执行error后,仍然会执行post),其示意图如下: 在Filter中可以定义某些条件下是否执行过滤器逻辑,以及同种类Filter的优先级。Filter的各个方法中并不存在入参,其参数传递是通过一个基于ThreadLocal实现的RequestContext,虽然RequestContext中定义了很多参数的读写方法,但初始的可用参数仅有req和res,对应HttpSerlvetRequest和HttpServletResponse。Filter代码范例如下: public class TestFilter extends ZuulFilter { @Override /** 是否拦截 */ public boolean shouldFilter() { return false; } @Override /** filter逻辑 */ public Object run() throws ZuulException { RequestContext context = RequestContext.getCurrentContext();// 获取当前线程的 HttpServletRequest req = context.getRequest();// 获取请求信息 return null; // 从源码来看,这个返回值没什么用 } @Override /** filter类型 */ public String filterType() { return "pre";// pre/route/post/error } @Override /** filter优先级,仅在同类型filter中生效 */ public int filterOrder() { return 0; } } Filter通常使用groovy编写,以便于动态加载。当我们编写好一个Filter类后,将其放在指定的磁盘路径下,FilterFileManager会启动一个守护线程去定期读取并加载。通过动态加载,我们可以在不停机的情况下添加、修改功能模块。FilterFileManager源码摘要如下: public class FilterFileManager { ... /** * Initialized the GroovyFileManager. * * @throws Exception */ @PostConstruct public void init() throws Exception { long startTime = System.currentTimeMillis(); filterLoader.putFiltersForClasses(config.getClassNames()); manageFiles(); startPoller(); LOG.warn("Finished loading all zuul filters. Duration = " + (System.currentTimeMillis() - startTime) + " ms."); } ... /** 启动线程定时读取文件 */ void startPoller() { poller = new Thread("GroovyFilterFileManagerPoller") { public void run() { while (bRunning) { try { sleep(config.getPollingIntervalSeconds() * 1000); manageFiles(); } catch (Exception e) { LOG.error("Error checking and/or loading filter files from Poller thread.", e); } } } }; poller.start(); } ... /** 读取文件并加载 */ void manageFiles() { try { List<File> aFiles = getFiles(); processGroovyFiles(aFiles); } catch (Exception e) { String msg = "Error updating groovy filters from disk!"; LOG.error(msg, e); throw new RuntimeException(msg, e); } } } SpringCloud-Zuul Spring Cloud通过集成Zuul来实现API网关模块,我们来简单介绍一下它的整合原理。 SpringCloud-Zuul的核心配置类是ZuulServerAutoConfiguration以及ZuulProxyAutoConfiguration。Spring首先使用ZuulController来封装ZuulServlet,然后定义一个ZuulHandlerMapping,使得除一些特殊请求以外(如/error)的大部分请求被转发到ZuulController进行处理。源码摘要如下: @Configuration @EnableConfigurationProperties({ ZuulProperties.class }) @ConditionalOnClass(ZuulServlet.class) @ConditionalOnBean(ZuulServerMarkerConfiguration.Marker.class) // Make sure to get the ServerProperties from the same place as a normal web app would @Import(ServerPropertiesAutoConfiguration.class) public class ZuulServerAutoConfiguration { ... @Bean public ZuulController zuulController() { return new ZuulController(); } @Bean public ZuulHandlerMapping zuulHandlerMapping(RouteLocator routes) { ZuulHandlerMapping mapping = new ZuulHandlerMapping(routes, zuulController()); mapping.setErrorController(this.errorController); return mapping; } } public class ZuulController extends ServletWrappingController { public ZuulController() { setServletClass(ZuulServlet.class); setServletName("zuul"); setSupportedMethods((String[]) null); // Allow all } ... } public class ZuulHandlerMapping extends AbstractUrlHandlerMapping { ... private final ZuulController zuul; ... @Override protected Object lookupHandler(String urlPath, HttpServletRequest request) throws Exception { if (this.errorController != null && urlPath.equals(this.errorController.getErrorPath())) { return null; } if (isIgnoredPath(urlPath, this.routeLocator.getIgnoredPaths())) return null; RequestContext ctx = RequestContext.getCurrentContext(); if (ctx.containsKey("forward.to")) { return null; } if (this.dirty) { synchronized (this) { if (this.dirty) { registerHandlers(); this.dirty = false; } } } return super.lookupHandler(urlPath, request); } ... private void registerHandlers() { Collection<Route> routes = this.routeLocator.getRoutes(); if (routes.isEmpty()) { this.logger.warn("No routes found from RouteLocator"); } else { for (Route route : routes) { registerHandler(route.getFullPath(), this.zuul); } } } } SpringCloud默认定义了一些Filter来实现网关逻辑,其中最核心的Filter——RibbonRoutingFilter是负责实际转发操作的,在它的过滤逻辑里又集成了hystrix、ribbon等其他重要框架。源码摘要如下: public class RibbonRoutingFilter extends ZuulFilter { @Override public Object run() { RequestContext context = RequestContext.getCurrentContext(); this.helper.addIgnoredHeaders(); try { RibbonCommandContext commandContext = buildCommandContext(context);//构建请求数据 ClientHttpResponse response = forward(commandContext);//执行请求 setResponse(response);//设置应答信息 return response; } catch (ZuulException ex) { throw new ZuulRuntimeException(ex); } catch (Exception ex) { throw new ZuulRuntimeException(ex); } } } 加载Filter的方式通过ZuulFilterInitializer扩展为可以从ApplicationContext中获取。源码摘要: /** 代码出自ZuulServerAutoConfiguration */ @Configuration protected static class ZuulFilterConfiguration { @Autowired private Map<String, ZuulFilter> filters;//从spring上下文中获取Filter bean @Bean public ZuulFilterInitializer zuulFilterInitializer( CounterFactory counterFactory, TracerFactory tracerFactory) { FilterLoader filterLoader = FilterLoader.getInstance(); FilterRegistry filterRegistry = FilterRegistry.instance(); return new ZuulFilterInitializer(this.filters, counterFactory, tracerFactory, filterLoader, filterRegistry); } } public class ZuulFilterInitializer { private final Map<String, ZuulFilter> filters; ... @PostConstruct public void contextInitialized() { ... // 设置filter for (Map.Entry<String, ZuulFilter> entry : this.filters.entrySet()) { filterRegistry.put(entry.getKey(), entry.getValue()); } } } Zuul2 随着业务的不断发展,Zuul对于Netflix来说性能已经不太够用,于是Netflix又开发了Zuul2。Zuul2最大的变革是基于Netty实现了框架的异步化,从而提升其性能。根据官方的数据,Zuul2的性能比Zuul1约有20%的提升。Zuul2架构图如下: 由于框架改为了异步的模式,Zuul2在提升性能的同时,也带来了调试、运维的困难。在实际的使用当中,对于绝大多数公司来说,并发量远远没有Netflix那样庞大,选择开发调试更简单、且性能够用的Zuul1是更合适的选择。 作者简介 任金昊,随行付架构部高级开发工程师。擅长分布式、微服务架构,负责随行付微服务生态平台开发。

资源下载

更多资源
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等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册