首页 文章 精选 留言 我的

精选列表

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

【SpringCloud技术专题】「原生态Fegin」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)

前提介绍 Feign是SpringCloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用。 由于遗留原因,某些项目中,整个系统并不是SpringCloud项目,甚至不是Spring项目,而使用者关注的重点仅仅是简化http调用代码的编写。 如果采用httpclient或者okhttp这样相对较重的框架,对初学者来说编码量与学习曲线都会是一个挑战,而使用spring中RestTemplate,又没有配置化的解决方案,由此想到是否可以脱离Spring cloud,独立使用Feign。 内容简介 Feign使得 Java HTTP 客户端编写更方便。Feign 灵感来源于Retrofit、JAXRS-2.0和WebSocket。Feign最初是为了降低统一绑定Denominator到HTTP API的复杂度,不区分是否支持Restful。Feign旨在通过最少的资源和代码来实现和HTTP API的连接。通过可定制的解码器和错误处理,可以编写任意的HTTP API。 maven依赖 <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-core</artifactId> <version>8.18.0</version> </dependency> <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-jackson</artifactId> <version>8.18.0</version> </dependency> <dependency> <groupId>io.github.lukehutch</groupId> <artifactId>fast-classpath-scanner</artifactId> <version>2.18.1</version> </dependency> <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-jackson</artifactId> <version>8.18.0</version> </dependency> 定义配置类 RemoteService service = Feign.builder() .options(new Options(1000, 3500)) .retryer(new Retryer.Default(5000, 5000, 3)) .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .target(RemoteService.class, "http://127.0.0.1:8085"); options方法指定连接超时时长及响应超时时长 retryer方法指定重试策略 target方法绑定接口与服务端地址。 返回类型为绑定的接口类型。 自定义接口 随机定义一个远程调用的服务接口,并且声明相关的接口参数和请求地址。 通过@RequestLine指定HTTP协议及URL地址 public class User{ String userName; } public interface RemoteService { @Headers({"Content-Type: application/json","Accept: application/json"}) @RequestLine("POST /users/list") User getOwner(User user); @RequestLine("POST /users/list2") @Headers({ "Content-Type: application/json", "Accept: application/json", "request-token: {requestToken}", "UserId: {userId}", "UserName: {userName}" }) public User getOwner(@RequestBody User user, @Param("requestToken") String requestToken, @Param("userId") Long userId, @Param("userName") String userName); } 服务提供者 import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping(value="users") public class UserController { @RequestMapping(value="/list",method={RequestMethod.GET,RequestMethod.POST,RequestMethod.PUT}) @ResponseBody public User list(@RequestBody User user) throws InterruptedException{ System.out.println(user.getUsername()); user.setId(100L); user.setUsername(user.getUsername().toUpperCase()); return user; } } 调用 与调用本地方法相同的方式调用feign包装的接口,直接获取远程服务提供的返回值。 String result = service.getOwner(new User("scott")); 原生Feign的两个问题 原生Feign只能一次解析一个接口,生成对应的请求代理对象,如果一个包里有多个调用接口就要多次解析非常麻烦。 Feign生成的调用代理只是一个普通对象,该如何注册到Spring中,以便于我们可以使用@Autowired随时注入。 解决方案: 针对多次解析的问题,可以通过指定扫描包路径,然后对包中的类依次解析。 实现BeanFactoryPostProcessor接口,扩展Spring容器功能。 定义一个注解类 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface FeignApi { /** * 调用的服务地址 * @return */ String serviceUrl(); } 生成Feign代理并注册到Spring实现类: import feign.Feign; import feign.Request; import feign.Retryer; import feign.jackson.JacksonDecoder; import feign.jackson.JacksonEncoder; import io.github.lukehutch.fastclasspathscanner.FastClasspathScanner; import io.github.lukehutch.fastclasspathscanner.scanner.ScanResult; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.stereotype.Component; import java.util.List; @Component public class FeignClientRegister implements BeanFactoryPostProcessor{ //扫描的接口路径 private String scanPath="com.xxx.api"; @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { List<String> classes = scan(scanPath); if(classes==null){ return ; } System.out.println(classes); Feign.Builder builder = getFeignBuilder(); if(classes.size()>0){ for (String claz : classes) { Class<?> targetClass = null; try { targetClass = Class.forName(claz); String url=targetClass.getAnnotation(FeignApi.class).serviceUrl(); if(url.indexOf("http://")!=0){ url="http://"+url; } Object target = builder.target(targetClass, url); beanFactory.registerSingleton(targetClass.getName(), target); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } } } public Feign.Builder getFeignBuilder(){ Feign.Builder builder = Feign.builder() .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .options(new Request.Options(1000, 3500)) .retryer(new Retryer.Default(5000, 5000, 3)); return builder; } public List<String> scan(String path){ ScanResult result = new FastClasspathScanner(path).matchClassesWithAnnotation(FeignApi.class, (Class<?> aClass) -> { }).scan(); if(result!=null){ return result.getNamesOfAllInterfaceClasses(); } return null; } } 调用接口编写示例: import com.xiaokong.core.base.Result; import com.xiaokong.domain.DO.DeptRoom; import feign.Headers; import feign.Param; import feign.RequestLine; import com.xiaokong.register.FeignApi; import java.util.List; @FeignApi(serviceUrl = "http://localhost:8085") public interface RoomApi { @Headers({"Content-Type: application/json","Accept: application/json"}) @RequestLine("GET /room/selectById?id={id}") Result<DeptRoom> selectById(@Param(value="id") String id); @Headers({"Content-Type: application/json","Accept: application/json"}) @RequestLine("GET /room/test") Result<List<DeptRoom>> selectList(); } 接口使用示例: @Service public class ServiceImpl{ //将接口注入要使用的bean中直接调用即可 @Autowired private RoomApi roomApi; @Test public void demo(){ Result<DeptRoom> result = roomApi.selectById("1"); System.out.println(result); } } 注意事项: 如果接口返回的是一个复杂的嵌套对象,那么一定要明确的指定泛型,因为Feign在解析复杂对象的时候,需要通过反射获取接口返回对象内部的泛型类型才能正确使用Jackson解析。如果不明确的指明类型,Jackson会将json对象转换成一个LinkedHashMap类型。 如果你使用的是的Spring,又需要通过http调用别人的接口,都可以使用这个工具来简化调用与解析的操作。

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

从“守护进程”到“无根”:Podman如何重塑容器化生态

长期以来,Docker几乎是容器技术的代名词。然而,随着容器应用深入生产环境,Docker的“单点架构”开始暴露出安全隐患与运维复杂性——其核心守护进程(dockerd)以root权限运行,一旦被攻破,整个宿主机即告沦陷;同时,守护进程的故障会导致所有容器失控。在这样的背景下,Podman作为新一代容器引擎强势崛起,以其无守护进程(Daemonless)、无根(Rootless)、兼容Kubernetes原生的设计理念,正在重新定义容器化的未来。

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

现已支持 Python 生态

License Manager Python SDK 正式发布 大家好!我们非常高兴地宣布,License Manager Python SDK 现已正式发布!🎉 作为 License Manager 授权管控中枢的官方 Python 客户端,本次发布的 SDK 专为各类的 Python 软件项目、AI 算法模型落地以及跨平台的私有化部署应用量身打造。我们的目标是为广大 Python 开发者提供从在线激活、离线鉴权、设备机器指纹绑定到云端后台实时心跳管控的“一站式”应用授权治理方案。 License Manager产品定位 软件商业化是一场系统性工程。从产品定价到用户获取,从试用到转化,从续费到升级,每一个环节都至关重要。License Manager作为您的商业化基石,提供完整的货币化技术栈。 License Manager支持企业级管理后台和用户端自助服务,实现B2B+B2C双轨运营,企业客户和个人用户均可享受便捷的授权体验。 🌟 核心亮点与能力 强硬件指纹锁定(一机一码防滥用): SDK 内置了坚固的跨平台设备特征提取能力(支持一键防伪造提取 MAC、CPU、Hostname 等多维指纹),与 SaaS 云端深度联动,有效防止已授权的软件被随意拷贝至其他机器泛滥使用。 混合鉴权模式(连网优先 + 脱机兜底): 在线激活:在联网状态下,用户只需输入短版产品激活码,即可自动从云端拉取下发许可证,全程对用户透明。 离线侧载验证:针对军工、工厂车间等物理隔离的无完全外网环境,我们完美支持通过“离线验证信封(Envelope)”机制,携带授权公钥完成高强度的本地化验签体验。 银行级数据防篡改保护: 依托于非对称加密系统(RSA-PSS + AES-GCM),无论是在网络传输过程中,还是最终生成的本地 license.lic 授权持久化缓存文件,均需经过不可逆的严格签名验证,从根源上抵御任何形式的客户端篡改和破解欺骗。 云端毫秒级实时管控响应 (Heartbeat): SDK 底层内置了轻量级、防干扰的心跳守护线程。这意味着,即便您的软件已经交付到了客户机,如果管理者在云端控制台执行了针对该设备的“禁止登录”、“解绑收回”操作,或是许可证到期,客户端将在极短的心跳周期内拉取阻断状态,并立刻回调挂起或锁死您的核心业务系统。 典型接入场景 机器视觉软件、AI 检测算法大模型、以及上位机控制系统的私有化分发交付。 桌面客户端、边缘网关与 License Manager 云端管控保持实时授权生命周期同步。 解决开源工具套件想要实现快速变现、分级订阅模式的授权落地难题。 快速接入体验 我们深知开发者体验的重要性,因此将底层复杂的非对称加密和通信排队逻辑全都进行了高级别封装。现在,您仅需一步引入: pip install cedarv-license-manager-sdk 只要几行代码来配置您的后台产品身份,设置好相关的状态告警日志回调,就可以立刻为您珍贵的项目加上企业级基础设施的安全锁。 Tips:我们在 SDK 的 examples/客户案例1 目录下同时也提供了一款基于可视化的 Client Simulator (客户端授权测试工具) Demo,附带 Windows 可执行程序,帮助您零代码跑通连网下发与防拉黑拦截的全流程。 ⬇️ 下载体验 Windows 64位 独立可执行程序: LMClientSimulator-win64.exe 欢迎访问以下资源了解更多详情,或直接获取详尽的接入指南: License Manager 官方网站:https://www.cedar-v.com 开发者快速接入文档库:https://docs.lm.cedar-v.com 期待各位 Pythonist 的接入与体验!如果您在使用过程中产生任何灵感、功能建议或遇到疑惑,非常欢迎在 Gitee 仓库给我们提 Issue 进行交流讨论。

资源下载

更多资源
Nacos

Nacos

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

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

用户登录
用户注册