首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

9.Nginx实践之使用MaxMind的GeoIP2实现处理不同国家或城市的访问最佳实践指南

本章目录 [TOC] 0x00 前言简述 描述: 为了实现根据访问者访问我们的网站时根据其IP显示其所属地,也为获取不同地区访问者的IP地址等相关信息为目的,所以在搜索引擎中查找解决方案,在网络上查询到如下几种方案...从安装部署包的下载、编译安装步骤以及命令使用、包括安装过程中可能会遇到的坑,在最后博主也通过几个实践例子,展示如何使用 GeoIP2 按国家/地区限制对某些 URL 的访问。...TIPS: GeoUP 依赖 MaxMind 的 IP 数据,需要频繁更新,所以我们在安装配置后也实现了使用crontab服务,针对其国家城市数据库进行自动化脚本定时更新配置。...WeiyiGeek.allow ip visit ---- 3.使用GeoIP2模块实现不同国家访问进入不同目录页面 描述: 在某些时刻我们可能会对不同地区来源访问的客户展示不同的页面,例如国内我就显示中文的页面...示例演示 在/usr/local/nginx/html目录中创建ch/en子目录,同时准备两个不同地区访问的测试页面: $ tree /usr/local/nginx/html ├── ch │

5.7K10

从零开始仿写一个抖音App——app架构更新与网络层定制

这几天为项目新增了五个模块,顺便看了看 kotlin 的语法并在项目中简单的实践了一下。本文中会讲解其中的两个模块,剩下的一些会在不久后发布的下一篇文章中进行讲解。...4.而项目中自己实现一个这样的东西一个是为了可定制性,另一个就是为了能了解一些技术的原理而不是单单只会用。 讨论3:建议以已完成某个功能模块或者某篇文章为版本,创建不同的tag,这样利于食用。...三、网络层定制 现在 okhttp + retrofit,也许是一个新项目的标配了,但是很多人都只是在使用这两个库的最基本的功能,殊不知这两个库可以通过定制来实现更多的功能。...这一节我就来讲讲如何基于这两个库来定制一个大项目的网络请求层。中间会穿插着一些原理的讲解。 1.网络层请求流程 ?...2.首先我们在需要请求一个接口的时候会使用 Retrofit 对象调用其 create 方法创建一个 XXXService。

1.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    我们为什么要把Dagger2,MVP以及Rxjava引入项目中?

    毫无疑问在Android开发圈中这三个技术是经常被提及的,如此多的文章和开源项目在介绍他们,使用他们,开发者也或多或少的被带动起来在自己的项目中使用他们,但是使用他们之前我们知道为什么要使用他们,他们能给我们带来什么好处吗...,懂了这个特性我们才知道在复杂的逻辑中运用Rxjava是多么的重要 结语 学习新技术,我们不应该盲目的跟风,我们如果不知道这个技术为什么出现,出现是为了解决什么,我们也就不知道为什么运用它,我们就算在项目中使用也无法灵活运用...,非常浅显的使用,复制粘贴一些模版代码,也根本无法扩展自己的思维 这些技术虽然比较适合大项目一点,但是还是建议各位开发者开始使用他们,使用他们能扩展自己的思维,让自己考虑耦合,扩展,团队协作之类大项目才会考虑的问题...如果想搭建一个新项目使用这些技术,改了包名就可以直接使用,包含详细的文档,相比于这些技术漫长的学习曲线,我们在实践中学习他们不是更快吗?...后面我会写一篇文章,介绍它是怎么将MVP,Dagger相结合并使用到项目中的 Where? MVPArms一个Mvp快速搭建框架,如果对您有用的话不妨右上角点个star?

    51230

    Google 推荐在 MVVM 架构中使用 Kotlin Flow

    ) 文章中的示例,也在 Repositories 或者 DataSource 中使用 LiveData,以至于在很多开源的 MVVM 项目中也是直接使用 LiveData,但是在 Repositories...在 Google 发布的 Jetpack 的最新成员 Paging3,在其内部的源码实现也是使用的 Flow,关于 Paging3 的使用可以参考以下链接: Jetpack 成员 Paging3 实践以及源码分析...,使用两个 LiveData,一个是可变的,一个是不可变的,如下所示: // 私有的 MutableLiveData 可变的,对内访问 private val _pokemon = MutableLiveData...的数据 DataBinding(数据绑定) 在 PokemonGo 项目中使用了 DataBinding 进行的数据绑定。...PokemonGo/app/src/main/java/com/hi/dhl/pokemon/ui/detail/DetailsFragment.kt 方式一: 使用两个 LiveData,一个是可变的

    4.4K21

    Gradle 构建工具 #5 又冲突了!如何理解依赖冲突与版本决议?

    例如,在大型软件项目中,往往是多个团队(或多名同学)协同开发不同模块,例如 A 模块依赖 B 模块,两个模块并行开发。...总的来说,动态版本倾向于积极拥抱最新版本,而快照版本倾向于积极集成开发版本,要根据具体的协同开发场景来选择,在实践经验中,变化版本(快照版本)的使用频率更大。...由于项目依赖中 "asm:asm:3.3.1" 和 "org.ow2.asm:asm:4.0" 都存在相同的 ASM 特性,所以当依赖关系树中存在两个相同实现时,构建就 Fail 掉了,不可能同一个类打包两份对吧...相比于依赖实现冲突,依赖版本冲突通常更加隐蔽,毕竟不同版本之间会考虑兼容性,所以构建时不会直接构建失败(构建成功不代表运行时不会 Crash,这是一个坑哦 ) 那么,我们怎么查看工程中存在的依赖版本冲突呢...一个误区: 需要避免混淆的是,在 Gradle 中使用 Maven 仓库,并不会左右 Gradle 的冲突解决策略,这里的 Maven 仓库仅用于提供依赖项,而依赖管理依然是在 Gradle 的框架内运行的

    74730

    你的 IDEA 是不是也卡成球了 !该如何优化 ?

    结果 Idea启动时间 加载大项目花费的时间 在IDEA中打开两个微服务 再次使用jstat –gcutil 最后的角逐:重新加载Monolith 最后一次使用jstat-gcutil 总结 讨论 -...目标 笔者的计划是,在一个接近日常开发项目的场景下(加载一个大项目、加载2、3个微服务、git pull 后刷新大项目),测试各个设置带来的效果,并选出内存消耗和速度都达到最优时的最佳设置。...大量的时间都花在了 Full GC 上面,这是 IDE 响应速度低的主要原因。 在IDEA中打开两个微服务 现在加载这两个微服务项目,在 IDEA 中打开并且对比他们所消耗的时间。...再次使用jstat –gcutil 加载完两个微服务项目后,来检查一下同时打开3个项目的情况下, GC 的表现情况。经测试发现,3个不同的自定义设置表现几乎差不多,而默认设置简直弱爆了。...笔者认为,在大多数情况下,把 Xmx 值设置在 2G 和 3G 之间是最佳的。如果你有更多的时间可以用 jstat 和 jvisualm 检查用不同的 JVM 设置如何影响性能和内存占用。

    3K21

    IntelliJ IDEA 内存优化最佳实践

    目标 笔者的计划是,在一个接近日常开发项目的场景下(加载一个大项目、加载2、3个微服务、git pull 后刷新大项目),测试各个设置带来的效果,并选出内存消耗和速度都达到最优时的最佳设置。...大量的时间都花在了 Full GC 上面,这是 IDE 响应速度低的主要原因。 在IDEA中打开两个微服务 现在加载这两个微服务项目,在 IDEA 中打开并且对比他们所消耗的时间。 ?...再次使用jstat –gcutil 加载完两个微服务项目后,来检查一下同时打开3个项目的情况下, GC 的表现情况。经测试发现,3个不同的自定义设置表现几乎差不多,而默认设置简直弱爆了。 ?...最后一次使用jstat-gcutil 因为 IDEA 在默认设置下无法刷新项目,所以,这次测试默认设置就不包括在里面。 ? IntelliJ IDEA 内存优化最佳实践 技术分享 第9张 ?...笔者认为,在大多数情况下,把 Xmx 值设置在 2G 和 3G 之间是最佳的。如果你有更多的时间可以用 jstat 和 jvisualm 检查用不同的 JVM 设置如何影响性能和内存占用。

    56320

    IntelliJ IDEA 内存优化最佳实践

    目标 笔者的计划是,在一个接近日常开发项目的场景下(加载一个大项目、加载2、3个微服务、git pull 后刷新大项目),测试各个设置带来的效果,并选出内存消耗和速度都达到最优时的最佳设置。...大量的时间都花在了 Full GC 上面,这是 IDE 响应速度低的主要原因。 在IDEA中打开两个微服务 现在加载这两个微服务项目,在 IDEA 中打开并且对比他们所消耗的时间。 ?...再次使用jstat –gcutil 加载完两个微服务项目后,来检查一下同时打开3个项目的情况下, GC 的表现情况。经测试发现,3个不同的自定义设置表现几乎差不多,而默认设置简直弱爆了。 ?...最后一次使用jstat-gcutil 因为 IDEA 在默认设置下无法刷新项目,所以,这次测试默认设置就不包括在里面。 ? IntelliJ IDEA 内存优化最佳实践 技术分享 第9张 ?...笔者认为,在大多数情况下,把 Xmx 值设置在 2G 和 3G 之间是最佳的。如果你有更多的时间可以用 jstat 和 jvisualm 检查用不同的 JVM 设置如何影响性能和内存占用。

    2.7K81

    Kotlin 协程 看这一篇就够了

    前言 Kotlin协程是什么,如何使用?如何结合Retrofit使用?Kotlin协程的优势在哪里?相信看完这一篇你一定有所收获!...简单的说就是协程可以让我们开启一个线程,是一个线程框架。当然实际项目中,开启协程我们不会使用上面的方法。...1、协程可以帮我们自动切线程 2、摆脱了链式回调的问题 Retrofit 如何使用协程 从Retrofit2.6.0开始,retrofit就自动支持协程了,这里我们从「聚合数据」上找到一个开放api 我们先来看之前我们怎么使用的...2同时请求,等请求结束后将结果合并显示过来,这里我们请求统一接口来模拟请求两个不同的接口 GlobalScope.launch(Dispatchers.Main) { try {...最后的最后,协程的强大远远不止上述 在项目中使用Jetpack 对kotlin的扩展,可以更加便捷的创建和使用协程.

    1.5K10

    RetrofitOkhttp API接口加固技术实践(上)

    /details/51597816) 文章介绍了怎么使用Retrofit,并且在遇到okhttps的使用方式,但对于加密我们还是无法了解太多,对于安全性要求很高的接口场景还是无法满足,今天就来介绍下对普通...加固API主要由四种方案: 使用Https URL加密 参数加密 加入权限 时效验证 数字签名 Https 以前写过一篇文章可以参考 :Retrofit 2.0 超能实践(一),完美支持加密Https传输...加入权限 权限控制也是对接口加密的一种业务层策略,比如一个电商APP,有商户,有用户,有中间物流商,还有中间服务商,那么同一个获取商品信息的权限不同的,商家有修改商品信息的权限,用户只能浏览查看的功能,...比如一秒内重复从一个客户端发两个请求(Request),服务端(server)拿到时间发现已经存在一个,就不再处理第二个订单信息,提示用户不要重复提交。...在客户端api加固中,常用上面这几种综合来实现,做到万无一失,从数据源的加密,到传输过程中加密,到数据源获取到权限的校验,整个过程都是做了防御的,如过需要给第三方提供接口认证, 可以使用授权,类似微信提供给你的三方登录一样

    65420

    Kotlin + buildSrc:更好的管理Gadle依赖!

    管理Gradle依赖的三种不同方法: 手动管理 使用Google推荐的“ext” Kotlin + buildSrc 1、手动管理 这是一种大多数人在采用的管理依赖的方法,但每次升级依赖库时都需要做大量的手动更改...Google推荐:使用gradle的extra属性 Google在Android官方文档中推荐这种管理依赖的方法。许多项目例如ButterKnife、Picasso等都在使用这种方法。...Gradle文档中有这样一段话: 当你运行Gradle时,它会检查项目中是否存在一个名为buildSrc的目录。然后Gradle会自动编译并测试这段代码,并将其放入构建脚本的类路径中。...动手实践: 新建的module名称必须为buildSrc 一开始我按照作者原文的描述,在Android Studio里右键单击项目,New 出一个名为buildSrc的Android Library,试了好几遍都提示...后来我参考这里的做法,手动创建了buildSrc这个模块。步骤如下: 1、在项目根目录下新建一个名为buildSrc的文件夹(与项目里的app文件夹同级)。

    2.6K10

    解决Retrofit多BaseUrl及运行时动态改变BaseUrl(二)

    等多个平台数据的 App, 因为各自平台的域名不同, 所以大多数这类 App 会给每个平台都各自创建一个 Retrofit 对象, 即不同的 BaseUrl 使用不同的 Retrofit 对象来创建...Retrofit 实例不止会造成资源的浪费,还会造成接口管理成本的增加,这个才是最重要的一点, 举个例 我们平时项目中所有的 ApiService 都是使用同一个 Retrofit 实例的 Retrofit...,出错的风险就越大,并且扩展性也在大打折扣,后面一有变更将会十分痛苦,随着项目中接口的增加,以及 Retrofit 实例的增加 (BaseUrl 的增加),这个管理成本会成几何倍的增加 使用多 Retrofit...这时项目中就出现了多个需要被替换的 BaseUrl 格式 (PathSize 不同),有些 URL 只需要替换 域名 以及前两个 pathSegments,有些又只需要替换 域名 以及前一个 pathSegments...,但是在开启高级模式时,只保存了一个 BaseUrl 的格式,这时使用高级模式实现此需求就比较棘手 这个需求是一个比较变态的需求,可能很多人遇不上,但是我想让您知道当您遇上了也不要怕,因为 RetrofitUrlManager

    1.3K40

    从零开始实现一个 mini-Retrofit 框架

    前言 本篇文章将采用循序渐进的编码方式,从零开始实现一个Retorift框架,在实现过程中不断提出问题并分析实现,最终开发出一个mini版的Retrofit框架 ?...演示一个使用OkHttp的项目Demo 为了更好的演示框架的实现过程,这里我先创建了一个简单的Demo项目 这个Demo项目中主要包含3个部分 Json数据对应JavaEntity类 项目中包装网络请求回调的...,除此之外这两个网络请求都需要传入 一个Class对象表示响应的Json数据对应的Model,以便在内部使用Gson来解析,以及网络请求的异步回调 NetCallback 我们不直接使用OkHttp提供的...@GET注解申明的Http请求的动态代理封装,下面我们在自己的项目中验证一下 3.2 在项目中验证 1.创建一个接口类,并添加一个方法,方法的返回类型为Call,方法是添加了@GET注解 package...,当用户设置了不同的注解,在内部我们使用OKHttp调用相应的方法。

    2K10

    面试|2021金三银四铜五安卓菜鸟被锤历程出炉,所有碰壁的心酸都是技术不牢固带来的

    在不使用任何三方库以及系统提供控件,如何实现 RecyclerView 下拉刷新? 直播是什么实现的?需要注意的有什么?使用过的视频格式有什么?如何保证视频以及文字/语音同步性? 开发过音频相关吗?...异步实现方式有哪儿些? 简单说下 Handler。 在一个线程中,可以创建多个 Handler 吗? 一个线程中有两个 Handler,那么它有几个消息队列?...组件化在不同模块是如何通讯的? 阿里的路由框架有了解过吗? 简单聊下 MVC、MVP 以及 MVVM 的优劣势。 DataBinding 和 ViewBinding 区别,在项目中使用了哪儿些?...项目中用到的网络框架是什么?对它们的底层源码有了解吗? 介绍下 OkHttp 有几大工具类吗? OkHttp 有几大拦截器? Retrofit 如何工作的原理。...Retrofit 采用的设计模式是什么? Retrofit 常用的几个方法。 对源码的掌握程度怎么样? 简单介绍如何实现一个懒加载。 Fragment 如何实现懒加载。

    66800

    RetrofitOkhttp 网络接口加固技术实践(上)

    Retrofit介绍请关注本公众号的历史文章 API加固 Retrofit安全相关的刚开始就写了一篇《Retrofit 2.0 超能实践(一),okHttp完美支持Https传输》(http://blog.csdn.net.../sk719887916/article/details/51597816),那篇文章介绍了怎么使用Retrofit,并且在遇到okhttps的使用方式,但对于加密我们还是无法了解太多,对于安全性要求很高的接口场景还是无法满足...权限控制 权限控制也是对接口加密的一种业务层策略,比如一个电商APP,有商户,有用户,有中间物流商,还有中间服务商,那么同一个获取商品信息的权限不同的,商家有修改商品信息的权限,用户只能浏览查看的功能,...比如一秒内重复从一个客户端发两个请求(Request),服务端(server)拿到时间发现已经存在一个,就不再处理第二个订单信息,提示用户不要重复提交。...在客户端api加固中,常用上面这几种综合来实现,做到万无一失,从数据源的加密,到传输过程中加密,到数据源获取到权限的校验,整个过程都是做了防御的,这种思维我们可以参考:OAuth 工作原理,那么很多时候我们也要对服务端返回的数据进行校验

    78810

    五分钟带你感受RxJava的优雅

    这是一篇RxJava的入门级介绍和接入教程,看完这篇文章你会明白几个问题, · RxJava 是什么 · 它的优势在哪里 · 怎么应用到项目中 RxJava是什么 RxJava是一个框架,也可以理解为一种代码思路...在RxJava中,最基础也是最根本的是两个接口,Observer 和 Observable,这跟Java中的接口名称是一样的。...而Retrofit是以OkHttp为基础封装起来的更简洁的网络请求库,它跟OkHttp是同一个公司的出品。 使用Retrofit的原因不仅因为它封装了更简洁的接口,还因为它兼容RxJava。...代码对比--RxJava+Retrofit 没使用过Retrofit的话可能需要补充一下相应的知识点。...这样就完成了一次网络的请求和UI更新。 链式调用+统一缩进,比用OkHttp的代码的阅读性提升了许多。但它的优势不仅如此,RxJava其中一个很重要的特性才是它被普遍使用的原因。 那就是线程切换。

    66130

    【Kevin聊敏捷】XP极限编程之12最佳实践(一)

    极限编程的12个最佳实践是大家在学习极限编程绕不过的点,为了便于大家理解和学习,我们可以分为四个实践圈。...:结对编程(Pair Programming),代码重构(Refactoring),持续测试(Testing) 图片 002.png 2.1 结对编程(Pair Programming) 结对编程是两个开发者在同一台电脑上工作...,一个类似于驾驶员的角色,一个类似于领航员的角色。...虽然国内很多开发人员都听说过结对编程的方法,但实际上很少有公司去实践。因为很多公司认为这是在浪费人力:明明两个人可以做两个模块的事情,你现在将两个人弄来处理一个模块。...我个人认为结对编程只能在小型的实验性的项目中去做。真正的大项目是不敢用这种编程方法的。

    82600

    【安卓】在安卓中使用HTTP协议的最佳实践

    在安卓中使用HTTP协议的最佳实践 在开发安卓应用时,网络通信是一个不可或缺的方面。HTTP协议是许多应用程序数据交换的基础,因此了解如何正确地使用它对于确保应用的性能和安全性至关重要。...Retrofit是一个高级的HTTP客户端,它允许开发者通过声明型安全地创建客户端接口,并支持多种序列化库。...安全网络通信 在进行网络通信时,保护数据和信息的安全性是非常重要的。以下是一些网络通信安全性的最佳实践: 减少敏感数据传输:尽量减少传输敏感或个人用户数据。...这样可以更容易地管理不同部分应用程序中的网络请求。 结论 在安卓应用开发中,正确使用HTTP协议对于提供良好的用户体验和保护用户数据至关重要。...通过遵循上述最佳实践,开发者可以确保其应用程序在网络通信方面运行高效且安全。 希望这篇文章能够帮助您理解在安卓中使用HTTP协议的重要性以及如何实现最佳实践。

    17710

    「2020 新手必备 」极速入门 Retrofit + OkHttp 网络框架到实战,这一篇就够了!

    Retrofit 早已不是什么新技术了,想必看到这篇博客的大家都早已熟知,这里就不啰嗦了,简单介绍下: Retrofit 是一个针对 Java 和 Android 的设计的 REST 客户机。...开始之前 这里我将以我的一个开源项目 FIWKeepApp 的登录模块举例 在 Retrofit 出现之前,原始社会的我们一般是这样进行网络请求的: public void login2()...那么 Retrofit 救世主就出现了 Retrofit 实现 还是我项目中的登录模块,我将其改为 Retrofit 的形式 同样完成上面的功能,如果用 Retrofit 实现只需要: // baseUrl...Get 请求 我们在看方法体,返回值会是一个封装了 UserBean 的 Call 对象 参数有两个,分别是 String username 和 String password 与平常方法不同的是...登录功能实战 到这里想必大家都已经学会了 Retrofit 的使用 那么现在我就拿登录功能举例,看看如何在项目中引用 Retrofit 实战部分先置条件是 MVP + ButterKnife,大家很容易在网上找到资料

    1.3K30

    Android开发模式之MVC,MVP和MVVM的简单介绍与区别

    相信大家对MVC,MVP和MVVM都不陌生,作为三个最耳熟能详的Android框架,它们的应用可以是非常广泛的,但是对于一些新手来说,可能对于区分它们三个都有困难,更别说在实际的项目中应用了,有些时候想用...MVP 通过具体的代码大家知道了MVC在Android上是如何工作的,也知道了它的缺点,那MVP是如何修正的呢? 这里先向大家推荐github上的一个第三方库,通过这个库大家可以很轻松的实现MVP。...真理在荒谬被证实以前,都只是暗室里的装饰 前面讨论了MVC,MVP和MVVM具体的实现方案,大家肯定都了解了它们三者的关系和使用方式。...路漫漫其修远兮,吾将上下而求索 其实,真正的最佳实践都是人想出来的,我们为何不结合一下MVP和MVVM的特点呢?其实谷歌已经做了这样的事,大家可以看下这个。...说到这里,我还是想重复刚才的那句话,最佳实践都是人想出来的,用这些框架根本的原因也是为了尽量低的耦合性和尽量高的可复用性。

    2.8K82
    领券