当前位置: 首页 > 后端技术 > PHP

PHP进阶之路——后端多元化快速切入Java开发

时间:2023-03-29 17:20:16 PHP

以下是我直播的文字版,直播地址:https://segmentfault.com/l/15...代码:https://github.com/zhoumengka...整个项目分为6个版本进行演化,希望能方便大家对比学习。之前在搜集大家是否愿意学java的时候误会了,得到了如下反馈:java==太复杂了java==各种乱七八糟的配置java==面向ide的编程其实我们在学习java的时候,那些高大上的我们根本不用去碰上面的工具也可以最小化各种配置文件。比如我们下面只有一个pom.xml配置文件。有同学说为什么还要学java?他们不应该都学围棋吗?其实语言真的不重要。我们需要掌握的是快速学习和使用一门语言的学习方法,这也是这节课的真正目的。不要一开始就带着放大镜去学习,就像瞎子摸大象一样。他可能需要很长时间才能看清大象的真面目,就像我们拿着放大镜学习java一样。经过这么多年的发展,java可以说是非常庞大了。如果我们想知道一头大象长什么样,就应该放下手中的放大镜,往后退一点,这样就可以非常清楚地看到它的全貌。学习一门新语言也是如此。网上的教程很多很多,非常大很全面。一般需要30-60小时的系统学习,才能正式接触项目开发。基础很重要,但是学太多的基础会让大家失去学习的乐趣和自信心。很多知识点其实是可以在project之后补充的。按需学习是自我驱动学习的最佳方式。比如hash分布,hash碰撞,hashmap的动态扩展,这些都是我们后期进一步完善需要了解的内容。前期我们只需要知道我们可以用hashmap做什么。以实现你所熟悉的为导向。比如我们做web后台api开发,首先是常用的循环/迭代,条件判断,增删改查。那么我们是不是可以快速的用java来实现这些用php可以很轻松做到的事情呢?这有助于我们快速增强自信心。类比一下,学会用PHP实现,用java再实现一遍就好了。最后,深入系统学习,当自己实现了一些小demo后,会参考别人的项目。如果一开始就直接看别人的项目,你可能根本不知道别人在做什么。比如别人用ConcurrentHashMap,就会想为什么我用HashMap而他用ConcurrentHashMap,带着疑问和思考看着开源代码。做完一些简单的项目,就可以回去系统地学习了。这时候,会有不一样的收获。最后,当项目需要调优,性能提升的时候,再一一分解,深入研究,更有针对性和针对性。实战之初,我们使用netty来提供高性能的web服务。使用简单方便(netty不简单),不依赖其他软件。然后想想完成一个简单的webapi服务器需要哪些必要的组件。(其实在思考这个的时候,一定要记住简单的结构)。我简单总结一下:java基本数据类型(php也有,不用怕)java集合框架(php有数组,很强大)先熟悉maven(php有composer)反射(用在框架路由等地方,php也有)序列化(需要用来传输数据,php没有复杂的数据结构,简单N倍)jdbc(需要用来操作数据库,php有pdo)大致了解泛型的语法,注解等(可选)使用netty开发webapi服务实战(php有swoole)Java基础数据结构,各种基础数据类型包装类Java-CollectionsFramework高频类实例HashSet是一个没有重复元素的集合.它是通过HashMap实现的,不保证元素的顺序,也就是说元素插入的顺序和输出的顺序不一致。这其实是我的老朋友。在redis中经常使用。比如我们可以用它来实现一个黑名单,这样查找速度非常快,而且不需要远程查询redis,而是直接在当??前内存中查询。ArrayList实现了基于数组的集合功能。它在内部维护一个可变长度的对象数组。集合中的所有对象都存储在这个数组中,并实现了数组长度的动态扩缩容。这不就是我们PHP中常用的索引数组吗?HashMap被实现为哈希表数据结构。查找对象时,其位置由散列函数计算。它专为快速查询而设计。特点是速度快,非线程安全。这不就是我们PHP中常用的关联数组吗?http://www.cnblogs.com/ITtang...http://www.jianshu.com/p/b54f...http://www.cnblogs.com/xiaoxi...初识mavenMaven基本原理很简单,使用远程仓库和本地仓库以及一个核心配置文件pom.xml,将pom.xml中定义的jar文件从远程仓库下载到本地仓库,每个项目都使用同一个本地仓库的jar,以及同版本的jar只需要下载一次,避免每个应用都复制jar。这个很像PHP的包管理工具composer,或者说composer是参考maven设计的。Maven更强大。Composer需要导入每个项目。Maven和git一样,有一个本地仓库。第三方包不会直接引用到项目中,而是在编译时引入(是的,不方便)。另一方面,maven不仅仅是一个包管理工具,还是一个集编译、打包、单元测试等功能为一体的项目管理工具。下面是最简单的演示,依赖netty和junit两个包。然后使用maven-compiler-plugin在编译时指定版本规则。4.0.0mengkang.netdemo1.0-SNAPSHOTio.nettynetty-all5.0.0.Alpha2junitjunit4.7测试org.apache.maven.pluginsmaven-compiler-plugin<版本>2.3.2<配置>1.81.8UTF-8v1.0buildhttpwebserver我复制了netty官方的demo地址如下:https://github.com/zhoumengkang/netty-http-demo/tree/v1.0当我们运行api.mengkang.net.netty.HttpServer.main方法时,服务器正在运行,当你在浏览器中访问http://localhost:9009/时,会返回HelloWorld方法使用api.mengkang.net.netty.HttpServer#mainserver启动入口api.mengkang.net.netty.HttpServerInitializer#initChannel初始化Channelapi.mengkang.net.netty.HttpServerHandler#channelReadNetworkI/O这是第一步,netty在这里充当网络服务器。而我们可以直接在netty提供的接口基础上进行编程,没有想到nginx+php-fpm也需要反向代理,而且性能要高很多。(swoole的方式和netty很相似)。v2.0实现controller的访问权限的具体要求:提供一个api让用户指定用户的信息定义接口:http://localhost:10000/users/{id}http://localhost:10000/?method=user.get&id={id}可能大家已经习惯了以前的restfulapi接口。因为需要路由映射和http方法匹配,考虑到学习成本,我没有选择这种方法。我们今天的目标是以最简单有效的方式实现我们的功能。我们先用最简单的方式来实现(其实不带路由的API是最快的,毕竟需要做的判断很少)。后面有兴趣的可以参考我写的一个restfulapidemonetty-restful-server的具体代码https://github.com/zhoumengkang/netty-http-demo/tree/v2.0做一个过渡版本,控制器还没有解析太多参数。只有一个$_GET['method']参数被解析。主要任务是通过获取的$_GET['method']执行UserController中的get方法。方法使用api.mengkang.net.RequestHandler#response从HttpServerHandler接管网络请求api.mengkang.net.RequestHandler#invoke执行反射调用api.mengkang.net.api.UserController#get模拟输出用户信息重点是反射使用Class类名;方法方法名;对象结果=空;classname=Class.forName("api.mengkang.net.api."+clazz+"Controller");对象inst=类名.newInstance();方法名=类名.getMethod(函数);result=methodName.invoke(inst);v3.0解析请求参数具体代码https://github.com/zhoumengkang/netty-http-demo/tree/v3.0方法使用api.mengkang.net.Request封装了一个通用的api请求对象,包括$_GET、$_POST、客户端请求的ip等。api.mengkang.net.RequestHandler#requestFetch将请求解析成api.mengkang.net.Request对象api.mengkang.net.RequestHandler#invoke传递api.mengkang.net.Request给Controller。Reflection使用构造函数实例化对象,以便将请求对象Request实例传递给Controller。Controller中的方法可以获取$_GET、$_POST、类似php://input的数据。Classclassname;ObjectclassObject;Constructorconstructor;MethodmethodName;Objectresult=null;classname=Class.forName("api.mengkang.net.api."+clazz+"Controller");constructor=classname.getConstructor(Request.class);classObject=constructor.newInstance(request);methodName=classname.getMethod(function);result=methodName.invoke(classObject);v3.1完善返回body信息的具体代码https://github.com/zhoumengkang/netty-http-demo/tree/v3.1使用api.mengkang.net.Response封装了一个通用的api响应对象,改成json,这样看起来更像一个普通的api服务。v4.0构建User对象,添加User对象,添加UserModel处理User对象的返回,完善错误返回机制。该类使用api.mengkang.net.entity.User描述用户对象,用于user.get接口的数据返回api。mengkang.net.model.UserModel由UserController调用,简单分层api.mengkang.net.ErrorCode改进了错误类型api.mengkang.net.api.UserController改进了错误类型的判断,对前端错误更友好的返回v5。0使用数据库动态查询类使用api/mengkang/net/utils/mysql添加自己封装的简单数据连接池操作工具api.mengkang.net.dao.UserDao查询数据库连接返回给UserModel.引入三个数据库查询和数据库连接池的A包mysqlmysql-connector-java5.1.18commons-dbcpcommons-dbcp<版本>1.4commons-poolcommons-pool1.6最后整个工程结构如下├──main│├──java││└──api││└──mengkang││└──net││├──Config.java││├──ErrorCode.java││├──Request.java│├──Request.javajava│-──│jjj││││││││││││├│-basecontroller.java│││└│-usercontroller.java││-Entity│├│└│││└│││││││││││││││││││││└│—usermodel.java│││├├i-netty│├-。├──MySelect.java││└──Mysql.java│└──资源│├──api.properties│├──read.db.properties│└──write.db.properties