首页 文章 精选 留言 我的

精选列表

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

Gutty 0.14.9 发布,基于 Guice 和 Netty 的网络服务框架

一直很喜欢 Netty 和 Guice,简单好用,一直想自己动手来整合他们。 Gutty 大概用了一个月的时间来做,参考 Spring 中一些习惯, 通过扫描包完成路由,依赖,长链接配置, 或是自动给 Controller 传递值。 也预置了 模板,Redis 和 Mybatis 的便捷接入, 可以按 URI 来添加多个 Filter,后面还会继续的完善和添加便捷的功能。 功能列表和完成状况 短连接 * [√] Guice 和 Netty 整合 * [√] 启动时扫描包,为 @Controller 和 @Socket 的类配置路由 * [√] 自动绑定扫描到的 @Service 的类(普通的绑定 和 按名称绑定) * [√] @Post @Get @Delete @Put 的 httpMethod 支持 * [√] 通过 @Product 识别返回值是 Json 还是 模板,或是 Protobuf 或是 Binary * [√] 控制类下的方法参数传入,支持 @CookieParm @QueryParam @PathParam @FormParam * [√] Controller 识别 和输出 Json 请求 * [√] Controller 识别 Protobuf 请求 * [√] 可以通过 @FileParam 来上传文件 * [√] 支持模板,预置 Freemarker 和 Thymeleaf 的接入 * [√] 支持 @RequestAttribute,可以用来提供 Session 功能 * [√] 适配 uri 的 Filter 支持 Websocket * [√] 整合 Websocket,通过 @Socket 指定类接收长连接数据 * [√] Websocket 的路由通过类的 @Path 完成配置 * [√] 支持 @Open @Close @Message @TextMessage @BinaryMessage @Ping @Pong 完成不同数据包的传递 * [√] 长连接 WebsocketFrame 的值可自动传入到你的 socket handler * [√] 添加 protobuf, json 的自动编码,解码到变量 * [√] 适配 uri 的 Filter 支持 * [ ] 长连接的参数还需要补充和完善 包引入 <dependency> <groupId>com.doopp</groupId> <artifactId>gutty</artifactId> <version>0.14.9</version> </dependency> compile 'com.doopp:gutty:0.14.9' 启动 Gutty public static void main(String[] args) { new Gutty().loadProperties(args) // 加载配置文件 // 设定扫描的包路径 .setBasePackages("com.doopp.gutty.test") // Json 支持 .setMessageConverter(JacksonMessageConverter.class) // 模板支持 .setViewResolver(FreemarkerViewResolver.class) // 添加 Filter .addFilter("/api", ApiFilter.class) // 配置数据库,需要引入 guice-mybatis 包 .setMyBatis(HikariCPProvider.class, "com.doopp.gutty.test.dao", PageInterceptor.class) // 配置多个 redis .addModules( new RedisModule() { @Override protected void initialize() { bindJedisPoolConfigProvider(JedisPoolConfigProvider.class); bindSerializableHelper(JdkSerializableHelper.class); } @Singleton @Provides @Named("userRedis") public ShardedJedisHelper userRedis(JedisPoolConfig jedisPoolConfig, SerializableHelper serializableHelper, @Named("redis.user.servers") String userServers) { return new ShardedJedisHelper(userServers, jedisPoolConfig, serializableHelper); } @Singleton @Provides public ShardedJedisHelper testRedis(JedisPoolConfig jedisPoolConfig, SerializableHelper serializableHelper, @Named("redis.test.servers") String userServers) { return new ShardedJedisHelper(userServers, jedisPoolConfig, serializableHelper); } } ) // 完成 injector 配置后,执行里面的代码,多用于任务的执行 .addInjectorConsumer(injector->{ ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(8); newScheduledThreadPool.scheduleWithFixedDelay(injector.getInstance(AgarTask.class), 1000, 16, TimeUnit.MILLISECONDS); }) .start(); } Controller 类 @Path("/api") @Controller public class HelloController { private static final Logger logger = LoggerFactory.getLogger(HelloController.class); @Inject private HelloService helloService; @Inject private UserDao userDao; @Inject @Named("userRedis") private ShardedJedisHelper userRedis; @GET @Path("/redis/read") @Produces("application/json") public User readRedis() { User user = userRedis.get("user_redis".getBytes(), User.class); return user; } @GET @Path("/redis/write") @Produces("application/json") public User writeRedis() { User user = new User(); user.setId(System.currentTimeMillis()); userRedis.set("user_redis".getBytes(), user); return user; } @GET @Path("/template") public String template(ModelMap modelMap) { modelMap.addAttribute("hello", "hello freemarker !"); return "hello.template"; } @GET @Path("/hello") @Produces("application/json") public String hello(@CookieParam("user") String user) { return helloService.hello(); } @GET @Path("/users") @Produces("application/json") public List<User> users(@RequestAttribute("hello") String hello) { System.out.println(hello); return userDao.selectAll(); } @GET @Path("/hello/{id}/{name}") public String hello3(@PathParam("id") Integer id, @PathParam("name") String name) { logger.info("id {}", id); logger.info("name {}", name); return helloService.hello(); } @POST @Path("/hello") @Produces("application/json") public User hello2(@FormParam("liu") String liu) { logger.info("liu {}", liu); User user = new User(); user.setNickName(liu); return user; } @POST @Path("/json") @Produces("application/json") public User hello2(User user) { logger.info("user {}", user); return user; } @POST @Path("/upload") @Produces("application/json") public String upload(@FileParam(value = "file", path = "d:/tmp") File uploadFile) { logger.info("file {}", uploadFile); return "hello"; } } Service 类 // HelloService.java public interface HelloService { String hello(); } // HelloServiceImpl.java @Service public class HelloServiceImpl implements HelloService { @Override public String hello() { return "hello kunlun !"; } } Websocket 类 @Socket @Path("/ws/game") public class HelloSocket { private static final Logger logger = LoggerFactory.getLogger(HelloSocket.class); @Open public void onConnect(Channel channel) { channel.writeAndFlush(new TextWebSocketFrame("you connected")); } @TextMessage public void onTextMessage(Channel channel) { channel.writeAndFlush(new TextWebSocketFrame("hello")); } @TextMessage public void onJsonMessage(@JsonFrame User user) { logger.info("user {}", user.getNickName()); } @BinaryMessage public void onBinaryMessage(BinaryWebSocketFrame binaryWebSocketFrame) { logger.info("binaryFrame {}", binaryWebSocketFrame.content()); } @BinaryMessage public void onProtobufMessage(@ProtobufFrame User user) { logger.info("user {}", user); } //@Message //public void onMessage(WebSocketFrame webSocketFrame) { // logger.info("onMessage : {}", webSocketFrame.getClass()); //} @Ping public void onPing() { } @Pong public void onPong() { } @Close public void onClose() { } }

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

腾讯位置服务地图SDK自定义地图和路况

前言 1、自定义路况 地图SDK一般的路况颜色都是相同的,如道路畅通为绿色、道路缓慢为黄色、道路拥堵为红色,但是通常都无法让用户自定义路况颜色。腾讯地图iOS SDK在4.3.9.1版本提供了自定义路况颜色功能,可以自定义路况的畅通拥堵颜色。 2、自定义地图 腾讯地图SDK在提供了基础配色的情况下,还支持自定义颜色,可以将如绿地、道路、河流等元素修改为自己指定的颜色,实现了高度自定义。 使用场景 1、自定义道路路况颜色 2、自定义地图元素颜色 准备 1、腾讯地图iOS SDK 2、腾讯地图控制台自定义地图样式 接入流程 1、自定义路况: 1)、创建QMapView时添加配置: 通常创建地图对象时直接使用的initWithFrame:方法,而QMapView还提供了另一个可以添加配置的方法 // QMapConfig提供了一个初始化方法,这个方法可以用于设置一个辅助Key // - (instancetype)initWithSubID:(NSString *)subID subKey:(NSString *)subKey; QMapConfig *config = [[QMapConfig alloc] init]; QMapView *mapView = [[QMapView alloc] initWithFrame:self.view.bounds config]: 2)、创建路况样式对象,并设置路况颜色: QMapConfig *config = [[QMapConfig alloc] init]; QTrafficStyle *style = [[QTrafficStyle alloc] init]; // 统一描边颜色 UIColor *whiteColor = [UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1]; // 交通顺畅颜色:青绿色 style.smoothColor = [UIColor colorWithRed:138/255.0 green:217/255.0 blue:28/255.0 alpha:1]; // 交通顺畅描边颜色 style.smoothBorderColor = whiteColor; // 交通缓慢颜色:黄色 style.slowColor = [UIColor colorWithRed:244/255.0 green:247/255.0 blue:89/255.0 alpha:1]; // 交通缓慢描边颜色 style.slowBorderColor = whiteColor; // 交通拥堵配色:橘色 style.congestedColor = [UIColor colorWithRed:250/255.0 green:154/255.0 blue:0 alpha:1]; style.congestedBorderColor = whiteColor; // 交通非常拥堵颜色:红色 style.seriouseCongestedColor = [UIColor colorWithRed:255/255.0 green:0 blue:0 alpha:1]; // 交通非常拥堵描边颜色 style.seriouseCongestedBorderColor = whiteColor; // 路况线宽 style.lineWidth = 2; config.trafficStyle = style; 3)、图片示例(西直门经典拥堵路段) 2、自定义地图样式 1)、首先,登录到腾讯地图管理控制台,然后进入个性化地图里面,随便找一个模板,选择编辑样式: 2)、左边的侧边栏显示的是地图中可以去自定义的颜色: 修改前 修改后 3、在iOS端套用自定义样式模板 在控制台将保存好的模板添加到对应的Key中,这里我将其放在了第三个栏位,在初始化QMapView地图实例之后,只需要调用接口就可以切换样式了:[mapView setMapStyle:3]; 图片示例 注意 目前自定义路况只支持一次性的配置,不能动态修改,我们后续会多多完善的。 作者:面糊 链接:https://www.jianshu.com/p/fa279777aae3 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

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

用户登录
用户注册