实习时间:在华为消费者BG软件部实习了两个月,作为一名后端开发工程师,对我帮助非常大,也让我接触了实战中会遇到的问题,与我自己独自练习有很大不同。
实习总结:在这两个月里,组内气氛融洽,组内同事都对提供了很多的帮助,故想记录一下这两个月的所学,也为以后打算实习的同学有个参考,提供些许帮助。
来公司之后,我们可能对公司项目一无所知,为了尽快熟悉业务,让自己能够上手,我推荐以下学习的步骤(如果我之前知道,可能效率就能更高些了)
1)新员工项目指导书:新员工项目指导书:刚开始的时候,一定要仔细看小组的新员工项目指导书,里面详细介绍了公司的业务。知道所属业务,能够使得自己大致掌握工作的内容方向,也为后面开发做铺垫。
2)介绍:我所在的项目组为鸿蒙智联开发者平台,为智能设备厂商进行智能产品的认证,嵌入到华为鸿蒙系统中使用。建立一个自助的可循环生态系统,使得大多数智能产品能够自助接入。
3)遇到的问题:业务信息了解个整体就可以,不用太细,可以在具体业务开发的时候再详细了解(当时项目介绍部分大篇幅在说认证的流程,我以为很重要,看了大半天,弄得比较细,但是后面发现我用到的不多),可以后续边学边了解
1)重要:组长当时和我强调,但是我不太会,中间也出错很多,花了很多时间,技巧是:先自己看教程,有问题还是多问,让别人帮着跑通项目程序。
2)介绍:我的项目有三个大文件,分别是platformService,UserService和PlatformAPI。不同项目大致也有类似三个服务。
(1)PlatformService实现平台的主要功能,里面有很多小服务;
(2)UserService里面包含一个服务,主要是与用户相关的功能,增删改查用户的信息。
(3)PlatformAPI:这个是网关,请求先通过网关,进行过滤鉴权等操作,后面才会转发给各个自服务。
3)遇到的问题:由于对项目安装不熟悉,所以最初花了很多时间在软件安装上面,后面还是在组长的帮助下跑通项目。最开始就要掌握:从CodeHub上面把代码克隆下来,然后能够自己配置文件,还有Maven的一些属性,使得能够跑通项目。
1)目的:这一步骤主要是验证,项目是否正常运行,能够得到想要的结果。
2)调试工具:我用的是PostMan,还是非常好用的。通过输入URL能够访问服务的请求,输出得到结果。操作简单,可自行查阅。
3)调试方法:调试的时候,有两种访问方式:跳过网关和不跳过;(网关的目的主要是实施一些与业务无关的操作,比如登录,鉴权,过滤。)
4) 跳过网关运行项目:
(1)访问url:本机ip:子服务端口号/服务中接口的路径?入参
(2)例子:127.0.0.1:8086/v1/community/list?pages=1
(3)参数输入:一般如果是get请求,入参放在url后面,如果是post请求,就放在url后面或者Body里面(如果输入一个实体类,那么只要把用到的成员变量放进去即可)
5) 通过网关运行项目:那么就需要传入cookie和token进行权限验证。(额外打开网关服务项目文件)
(1)访问url:本机ip:网关端口号/integration/服务名/服务中接口的路径
(2)例子:127.0.0.1:9210/integration/ProductyService/v1/community/list?pages=1
(3)加入网关之后,需要获取Cookie和token信息,放入Headers里
(4)其他入参:与不通过网关一致,url后面或者Body里面。
(1)@RestController : 注解的作用为输出显示为json数据格式,而非视图
(2)@RequestMapping:是一个用来处理请求地址映射的注解,可以作用在类或者方法上面,用在类上,表示该类中的所有响应请求的方法都是以该地址作为父路径的。
(3)@Validated:数据校验注解,对类进行标注
(4)@Value()获取配置文件中的属性值。配置文件具有访问顺序::classpath:/具有最低的访问权限。配置文件使用的是application-local.yml文件中的,可以在Maven右边配置中进行选择。
(5)@RpcReference:调用了三个其他服务,其中中间一个没有找到。(已经在代码库里面找到这个文件了)
-. 是CSE提供的用于rpc调用的注解。通过这个注解可以实现通过rpc的方式调用别的微服务,而不用感知要调用的微服务在哪里,address是什么。
-. 有点类似于@Autowired。注解包含两个参数:microserviceName指向服务名字,schemaId指向具体业务名字。
-. 其他服务中,如果一个业务层想成为一个远程过程调用,就需要在文件夹中新建文件rpc.privider,里面写好需要进行远程调用的程序即可,需要加上注解:@RpcSchema。
(6)@Operate:自定义注解:规定资源和操作类型
(1)Dao:数据访问层,同Mapper层(在resource),一张表就对应一个Dao层,对其进行处理。
(2)Service:业务层,基于Dao层,能够对功能进行实现;通常里面会有impl,即如果在业务层里面添加实现接口,对应在impl里面实现。通过接口和实现的模式,可以让实现类能够完成指定的功能。
(3)Controller:表现层,基于Service层。
(4)Util:工具层,封装一些与业务没有耦合的方法,方便调用
(5)Entity:实体类,即一些表的定义都是在这里,封装表等内部的数据情况。一表一实体。
(6)Rpc.provider:远程过程调用层,定义一些本服务可能会被远程调用的服务,并设置为rpc,其他服务后面直接调用就可以用了。
(设定:在本服务的一些类上加上标注:@RpcSchema,就可以申明为rpc类了)
(调用:@RpcReference(microserviceName =A, schemaId =B),包含两个参数,一个是服务的名字,一个是实例化的具体rpc类的名字 )
(7)Enums:枚举层,就是针对一些表格,通过用一些符号表示特殊的意义。
Local:本地环境,用于开发人员自己本地开发使用。项目在本地运行都要在local环境中。
Dev:开发者环境,开发人员把项目部署上线,运行调试的环境
Sit:系统集成测试环境(内测),测试人员进行测试的环境
Uat:用户验收测试环境,非常接近于用户使用的环境,在做上线之前需要在这个环境内运行。
1)当学习完前三步,已经能够独立操作一个项目了,后面就是对项目的原理进行了解了
2)可以找组长沟通,找一个熟悉的业务,如果你来做,会打算怎么做,然后对照项目中的代码,看看别人怎么写的。
3)在这一步,主要了解如何实现一个功能:Dao层,Service层,Controller层如何进行书写,是否需要新建Util实体类和Enum枚举类。
4)对上一部分不了解的,一定要找文章看一下,一个功能是如何实现的。简要说明:如果需要对数据库操作,书写Dao层,写明方法,然后再resource层mapper的. xml文件中书写sql语句实现;在Service层书写一些方法,通过使用Dao层的方法,完成一写指定功能;最后在Controller层,利用若干个个Service层的方法,完成整体的逻辑,并且提供接口进行外部访问。
例子:我想实现一个功能:在网页上显示一个对白名单的操作页面,能够对白名单进行增删改查。
Util层:我需要新增一个白名单表的实体类,白名单表中有哪些信息可以查询。
Dao层:数据持久层,书写对数据库的操作方法,我需要对白名单进行增删改查四个操作,所以书写四个函数。然后书写对应的Mapper文件,在里面书写sql语句进行增删改查功能实现。
Service层:书写增删改查四个方法,比如对于删除,首先我需要判断是否存在这个元素,才能进行判断,所以我再删除要先要调用Dao层的查询方法,查询是否为空,不为空,再调用Dao层的删除方法。Service层的方法,可以同时使用多个Dao层方法。
Controller层:书写四个请求:增删改查。比如还是删除操作,在这一层就需要先鉴权了,可能不是每个用户都拥有删除的操作,先鉴权,然后再调用Service中的删除方法,这里又进一步在Service层多了些内容。
** 综上**,上面只是一个很简单的需求,但是开发的顺序就是这样,越底层,考虑的内容更少,越向上,考虑的东西就更多。
1)目的:当我们书写方法的时候,不同服务可能都会用到同一个方法,为了实现代码的复用,可以采用方法的调用。
2)调用方式:服务与服务之间相互调用
(1):http的调用:需要配置各种文件,很麻烦:https://server//path//…
(2):RPC:cse://server//path…,这个方便了一些,但是需要时在同一个注册中心,同一个APPID里面(每一个配置环境对应一个APPID)
(3):APIjar包:即在开发每一个服务的时候,开发出对应的API包,之后能够供其他服务进行方便的调用,就像调用本地的方法一样。
3)下面主要介绍服务间的通信方法:RPC和RESTful API
4)RPC:远程过程调用
(1)定义:一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议,可以实现像调用本地方法一样调用其他服务方法。RPC是一种技术代名词,可以采用Http协议,也可以采用TCP/IP协议,通过动态代理实现像在本地调用一样。
(2)优缺点:调用简单,清晰,透明,不用像 rest 一样复杂,就像调用本地方法一样简单;低延时,高性能,自带负载均衡;耦合性强,定制化程度更高,适合公司内部使用。
5)RPC:实战中调用步骤
(1)在原有的服务里面新建一个文件夹rpc,里面放两个文件(最好放在子服务-api中)
接口放在api中,实现类放在service中
接口的实现类,需要额外添加一个注解;@RpcSchema(schemaId = “w3RpcServiceProvider”)
(2)在需要调用rpc的service上面进行书写服务注入
@RpcReference(schemaId = “w3RpcServiceProvider”, microserviceName = “NotificationCenter”)
private W3RpcService w3RpcService
(3) 在需要调用rpc的pom中添加
-. 添加rpc原服务的jar包
项目名字
子服务名
${project.version}
6)REST:
(1)定义:REST 是一种使用 HTTP 协议的进程间通信机制,一般使用 Json 来传递数据;可以使用自定义的URL进行服务调用,而不用关心服务的具体地址。
(2)优缺点:通用性更强,定制化程度小,效率会比RPC低些。
1)总结:学习完上面的,至少对如何运行项目,项目之间服务的架构,还有如何编写程序实现功能的逻辑,接下来需要了解更深一些,可以去获知项目使用的框架。
2)项目框架问题
(1)项目使用的底层框架是什么?SpringBoot
(2)微服务是什么,为什么需要使用微服务?最简单是为了开发更加高效,专注于一个点
(3)微服务框架有哪些?华为内部使用的是什么?华为使用的是CSE
(4)CSE与Spring Cloud的区别是什么?CSE性能更高,功能更全。
1)上面都是了解只是,看别人怎么写代码;
2)真正想上手,还是得自己实现一定的需求,进行实战。
3)这其中就包括如何使用Git对项目进行管理,如何对所写代码进行测试(接口测试与业务功能测试)
4)还包括一个需求如何从提出到落实
1)对Service实现类测试:这个主要通过Spring Boot的测试方法来实现
(1)框架使用:JUnit+AssertJ
(2)活用注解:@BeforeClass,@Before;@AfterClass,@After
(3)测试用例代码三段式:Give:基本数据参数;When:调用被测试方法;Then:结果的输出
2)Controller接口的测试:主要使用Postman进行完成(因为是前后端分离的)
(1) url:路径
(2) type:类型,Get/Post/Put等
(3) header:消息头,主要说明一些数据格式(Content-Type,Token,Cookie)
(4) Body:消息体,主要输post输入参数放在这
(5) param:消息,主要是get中在url的参数会解析放在这
(1)确定需求:首先是客户经理或者开发测试人员提出需求:可以是未涉及的功能,也可以是性能的提升。
(2)纳入版本计划:开版本讨论会,确定需求编入该版本。
(3)串讲:开发人员对所需要实现的需求进行实现逻辑讲解,这其中包含前端和后端开发人员,设计一个可行的实现方案,同时与需求提出人员进行比对,查验开发人员与需求提出人员对需求的理解是否一致。
(4)反串讲:开发人员再详细讲解具体实现逻辑,测试人员根据开发逻辑,进而提出测试的逻辑。
(5)开发:开发人员进行开发,代码书写完,需要进行自测试,然后提交给测试人员之前需要demoshow(即展示基本逻辑是否能够实现);demoshow通过之后提交测试
(6)测试:测试人员根据不同的情况,对接口进行访问,查找出可能会出错的地方。
(7)代码合并:一个需求就这么结束了
1)遇到错误总结:在编写接口实现功能的时候,为了使得代码清晰,也方便后期的维护,有一定的规范性,我遇到的问题总结如下:
(1)关键日志输出:对关键数据进行日志行的输出,方便查看运行情况
(2)常量定义:代码中出现数字或者字符串,用常量表示,且全为大小,下划线分割
(3)类复用:重复代码定义为类,方便继承
(4)解释说明:一定要说清楚方法的目的,输入参数与输出参数的具体意义。
(5)版权注释:在文件顶部,注释版权许可信息
(6)删除无意义行:代码编写是,可能会引入多余参数或注入,后续没有用到,需要统一删除,精简代码。
2)接口编写规范注意项总结
(1)接口参数校验:对输入,输出参数进行校验
(2)接口兼容性:不能直接删除老接口,要进行兼容
(3)接口扩容性:接口不应该局限于一种功能,应该可以拓展为多种类似功能
(4)第三方接口调用注意:考虑超时,异常和重试次数,方便自己的逻辑。
(5)日志打印:关键代码位置,日志打印好,方便查看运行情况
(6)接口功能单向:接口能够实现的功能单一,不能进行杂糅,与可拓展性不冲突
(7)可变参数配置化:一些经常会变动的数据,作为一个配置类进行数据配置,适用不同范围
(8)接口实现:SQL的优化
(9)接口状态与错误:接口运行成功返回值,运行失败,返回对应的错误码和描述,不能直接抛出异常信息。
(10)接口的异常处理:
(11)优化程序逻辑
(12)接口的安全:隐私信息的脱敏;不能随意访问,采用token机制
(13)接口定义:清晰易懂,命名规范
在华为实习两个月,虽然不是很长,但是让我切切实实体会到未来工作的日常。没来之前听说华为内部加班特别厉害,但是来了才知道,得分部门,分时段,所以还是只有亲身体会才知道。
组内氛围很好,主管与同事之间也都非常热情帮助我,虽然有时一些问题确实很简单,但是还是耐心讲解,也让我从一个小白,逐渐能够独立完成一些任务。
在实习过程中,自我感觉有以下几点是非常重要的,我之后也会坚定贯彻下去:
1)不要拒绝思考一些东西,留出一部分时间思考是非常重要的思想。
2)时刻别忘记自己因为什么而出发,在每一个小的阶段都非常重要
(1)阶段性询问自己,为什么现在在做这件事,做事情的意义在哪里?
(2)根据上一步的结果,及时调整计划走向(总结归纳)
(3)每天留给自己一些安静思考的时间,巩固一天所学,用讲述的方式讲给自己听。
3) 如何快速理解一个全新的大的项目?
(1):从上到下去理解项目(上指局部,下指自我业务源码,先大后小)
(2):遇到问题,自己先解决,带着自己查阅的资料,不会再问身边的同事,进行快速了解;一定要有自己思考的时间,不可不思考直接询问,这样印象也不会深刻。