2018.06.06
工作內(nèi)容:
1.嘗試解決前端開發(fā)手冊,開發(fā)新功能,已經(jīng)全局安裝了gulp但是不能啟動(dòng)問題;嘗試本地安裝,重新全局安裝,未解決;卸載gulp,重新安裝gulp,依然不能啟動(dòng),未解決;
2.嘗試搭建后端開發(fā)手冊,測試與集成;按照流程搭建,能夠通過http://localhost:8000/訪問到正常界面;但是manager-service服務(wù)一直連不上數(shù)據(jù)庫,啟動(dòng)不成功;重新拉取鏡像,重新初始化數(shù)據(jù)庫,能啟動(dòng)所有服務(wù);但是訪問http://localhost:8000/出現(xiàn) EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.未解決;
3.學(xué)習(xí)了解k8s、docker、后端開發(fā)流程,git常用指令;
4.參與平臺(tái)培訓(xùn)。
學(xué)習(xí)內(nèi)容:
1.k8s組件
是基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案,是容器集群管理系統(tǒng)。
1)master是集群管理節(jié)點(diǎn),負(fù)責(zé)管理集群;
2)Node是集群架構(gòu)中運(yùn)行pod的服務(wù)節(jié)點(diǎn);
3)Pod 運(yùn)行于Node節(jié)點(diǎn)上,若干相關(guān)容器的組合;
4)Replication Controller管理Pod的副本,保證集群中存在指定數(shù)量的Pod副本;
5)Service定義了Pod的邏輯集合和訪問策略;
6)Label在k8s中任意對(duì)象都通過Lable進(jìn)行標(biāo)識(shí);
2.Docker
相關(guān)概念;
1)鏡像(Image),鏡像是靜態(tài)的/可以被用戶分享的文件,只能pull或者push;
2)容器(Container),可以理解為鏡像的動(dòng)態(tài)狀態(tài);
3)倉庫(Repository),Docker中的倉庫很像git的代碼倉庫。
基本操作:查看鏡像 docker images 獲取鏡像 docker pull 啟動(dòng)容器 docker-compose up,
從docker進(jìn)入mysql docker exec -it mysql /bin/bash,
3.后端開發(fā)流程熟悉
1)infa層
DO類--》對(duì)應(yīng)數(shù)據(jù)庫中的具體類
mapper--》mapper接口類和mapper.xml
2)domain層
entity類--》對(duì)應(yīng)DO類
convertor類--》用于E。DTO。DO三者之間轉(zhuǎn)換
Repository--》對(duì)數(shù)據(jù)庫進(jìn)行操作,有對(duì)應(yīng)接口和實(shí)現(xiàn)類
service--》進(jìn)行業(yè)務(wù)操作
3)app層 應(yīng)用層
4)api層 展現(xiàn)層
DTO--》封裝用戶請求
controll--》是對(duì)一個(gè)具體的DTO資源進(jìn)行處理
2018.06.07
工作內(nèi)容:
1.前端開發(fā)手冊--》開發(fā)新功能--》開發(fā)新模塊,按照流程走,不能啟動(dòng)gulp,切換nodejs版本,重新全局安裝gulp不能解決;咨詢前端同事,demo文件夾為空,加入相關(guān)文件,gulp能夠運(yùn)行。
2.后端開發(fā)手冊--》集成與測試,服務(wù)啟動(dòng)報(bào)錯(cuò),刪除現(xiàn)有鏡像,新建文件夾重新拉取;所有服務(wù)都能啟動(dòng)成功,但是不能訪問loaclhost:8000,logs發(fā)現(xiàn)不能啟動(dòng)manager-service服務(wù);改為從github上下載項(xiàng)目本地運(yùn)行,啟動(dòng)服務(wù)成功;但是不能在eureka上顯示,給啟動(dòng)類加上@EnableEurekaClient,成功顯示;但是不能訪問http://localhost:8963/swagger-ui.html,重新初始化數(shù)據(jù)庫,配置路由,訪問成功。
學(xué)習(xí)內(nèi)容:spring boot
1.Profile,在不同環(huán)境下使用不同配置@Profile("dev"/"prod")
2.事件(Application Event)為Bean與Bean之間的消息傳遞提供了支持;步驟,定義事件,定義監(jiān)聽,容器發(fā)布
3.多線程,實(shí)現(xiàn)AsyncConfigurer接口,獲取一個(gè)基于線程池的TaskExecutor,@EnableAsync開啟對(duì)異步的支持,@Async聲明異步
4.this 1)表示構(gòu)造函數(shù)傳遞,this(a,b) 2)在類的非static成員內(nèi)部使用,表示這個(gè)類本身或者對(duì)象類型
super 1)調(diào)用父類構(gòu)造方法 2)調(diào)用父類的protected方法
5.spring boot配置文件 https://blog.csdn.net/lpfsuperman/article/details/78287265
2018.06.08
工作內(nèi)容:
1.跟據(jù)文檔搭建前端開發(fā)手冊--》開發(fā)新功能,需要改動(dòng)的小細(xì)節(jié)已經(jīng)發(fā)到群里;
2.重新搭建后端開發(fā)手冊--》測試與集成部分,能啟動(dòng)所有服務(wù),手動(dòng)配置路由,能進(jìn)入到http://localhost:8963/swagger-ui.html頁面。
學(xué)習(xí)內(nèi)容:
1.spring-retry是針請求超時(shí)情況采取一下重試操作
1)添加maven依賴 org.springframework.retry 2)在啟動(dòng)項(xiàng)添加重試配置 @EnableRetry 3)@Retryable 標(biāo)注此注解的方法在發(fā)生異常時(shí)會(huì)進(jìn)行重試
2.zuul主要功能是路由轉(zhuǎn)發(fā)和過濾器;路由功能是將外部請求轉(zhuǎn)發(fā)到具體的微服務(wù)上;過濾器是對(duì)請求處理的過程進(jìn)行干預(yù);@EnableZuulProxy開啟服務(wù)
3.Eureka服務(wù)注冊發(fā)現(xiàn)
server
1)添加依賴 <artifactId>spring-cloud-starter-eureka-server</artifactId>
2)application.yml配置
security:
basic:
enabled: true #開啟認(rèn)證
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://user:password@localhost:8761/eureka
3)主程序入口添加 @EnableEurekaServer//開啟Eureka Server
Clients
同上,application.yml配置:
eureka:
client:
serviceUrl:
defaultZone: http://user:123456@localhost:8761/eureka #注冊 中心已經(jīng)開啟認(rèn)證
鏈接:https://www.cnblogs.com/brant/p/6298342.html
4.bootstrap與application
1)bootstrap.yml先加載 application后加載
2)bootstrap.yml 可以理解成系統(tǒng)級(jí)別的一些參數(shù)配置,這些參數(shù)一般是不會(huì)變動(dòng)的。
application.yml 可以用來定義應(yīng)用級(jí)別的
5.@Order控制配置類的加載順序
2018.06.11
學(xué)習(xí)內(nèi)容:
1.spring基礎(chǔ)學(xué)習(xí)
Spring IOC容器,Spring BaenFactory/ApplicationContext,Spring依賴注入,基于構(gòu)造器注入和set方法注入/自動(dòng)裝配等。
2.學(xué)習(xí)springboot+mybatis,用注解方式實(shí)現(xiàn),能夠正常訪問;用配置文件方式,報(bào)錯(cuò)org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.scptest.springbootmybatisdemo1.mapper.UserMapper.getUserById,修改配置文件,修改mapper文件,未解決;修改application.yml文件,解決。
2018.06.12
1.Docker for windows一直啟動(dòng)不成功;
報(bào)錯(cuò):[Docker for Windows error: “Hardware assisted virtualization and data execution protection must be enabled in the BIOS” [closed]]
https://stackoverflow.com/questions/39684974/docker-for-windows-error-hardware-assisted-virtualization-and-data-execution-p,解決方法都嘗試了一遍,未解決;win10
一直不能開啟hyper-v虛擬機(jī),準(zhǔn)備重新升級(jí)系統(tǒng)。
2.訪問404錯(cuò)誤
將@Countller改為@RestController或者加上@ResponseBody;
1)@responseBody注解的作用是將controller的方法返回的對(duì)象通過適當(dāng)?shù)霓D(zhuǎn)換器轉(zhuǎn)換為指定的格式之后,寫入到response對(duì)象的body區(qū),通常用來返回JSON數(shù)據(jù)或者是XML
2)@RestController是@ResponseBody + @Controller合體,當(dāng)你在這個(gè)controller中方法只是想返回一個(gè)頁面時(shí),就不能用@RestController,因?yàn)樗鼤?huì)把你的返回值當(dāng)作數(shù)據(jù)返回,而不是頁面名字,所以這時(shí)候就只能用@Controller。
3.Establishing SSL connection without server's identity verification
解決:在mysql連接上加上?&useSSL=true&useUnicode=true&characterEncoding=utf8
4.git checkout master
error: pathspec 'master' did not match any file(s) known to git.
解決:git checkout -b master
https://blog.csdn.net/wankui/article/details/53328369
5.jmeter學(xué)習(xí)
1)status 415錯(cuò)誤
為該次請求修改請求頭里的 Content-Type ,修正為 application/json;charset=UTF-8
2)status 401錯(cuò)誤
在HTTP管理頭添加對(duì)應(yīng)的Jwt_Token。
2018.06.13
用jmeter對(duì)gilab-service進(jìn)行測試;
1)一直status 415錯(cuò)誤,即使添加了Content-Type = application/json,刪掉http管理,重新添加或者刪除Content-Type重新添加;
2)status 403或者其他,都是參數(shù)未傳遞正確。
2018.06.14
1.git解決分支沖突,兩個(gè)分支都對(duì)同一個(gè)文件進(jìn)行了提交,對(duì)這兩個(gè)分支進(jìn)行合并會(huì)失敗,手動(dòng)更改進(jìn)行合并;分支合并時(shí)加上--no-ff 禁用Fast forward模式,可以從歷史上看出分支信息。
2、@ApiOperation不是spring自帶的注解是swagger里的
@ApiOperation(value = “接口說明”, httpMethod = “接口請求方式”, response = “接口返回參數(shù)類型”, notes = “接口發(fā)布說明”;
@ApiParam(required = “是否必須參數(shù)”, name = “參數(shù)名稱”, value = “參數(shù)具體描述”)
3、地址①http://localhost:8989/SSSP/emps?pageNo=2
地址②http://localhost:8989/SSSP/emp/7
如果想獲取地址①中的 pageNo的值 ‘2’ ,則使用 @RequestParam ,
如果想獲取地址②中的 emp/7 中的 ‘7 ’ 則使用 @PathVariable
4、@RequestBody 注解則是將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個(gè)對(duì)象。
5.Java 8中的[Optional<T>]以包含非空值的容器對(duì)象,在 [Stream API]中很多地方也都使用到了Optional。
1)Optional<SomeType> someValue = someMethod();
if (someValue.isPresent()) { // check
someValue.get().someOtherMethod(); // retrieve and call
}
2)orElseThrow如果有值則將其返回,否則拋出supplier接口創(chuàng)建的異常
3)map如果返回值不為null,則創(chuàng)建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional
4)ofNullable 指定的值創(chuàng)建一個(gè)Optional,如果指定的值為null,則返回一個(gè)空的Optional
6.java Patter.matches https://www.cnblogs.com/ggjucheng/p/3423731.html
7.projectDO.getStatusCode().is2xxSuccessful()
1)ResponseEntity<T>是Spring對(duì)HTTP請求響應(yīng)的封裝,包括了幾個(gè)重要的元素,如響應(yīng)碼、contentType、contentLength、響應(yīng)消息體等;
2)getStatusCode()方法取得HttpStatus對(duì)象;getBody();getHeaders();等
3)is2xxSuccessful();判斷狀態(tài)嗎是否是2開頭
https://blog.csdn.net/u012702547/article/details/77917939
8.Class<T>以及Class<?>的理解
Class<T>在實(shí)例化的時(shí)候,T要替換成具體類
Class<?>它是個(gè)通配泛型,?可以代表任何類型
9.lambda () -> 5 不需要參數(shù),返回值為 5
2018.06.19
1、給所有api都加上對(duì)應(yīng)的角色;
2、IDEA中pom.xml報(bào)錯(cuò)project上Failed to read artifact descriptor for
1)去庫文件夾中查詢對(duì)應(yīng)的jar文件,刪除文件,重新下載;
2)在m2文件夾下放入setting.xml文件,清理項(xiàng)目重新加載;
2018.06.20-2018.06-22
1、從業(yè)務(wù)角度測試所有api角色是否添加正確;
2、mvn pacakge項(xiàng)目報(bào)錯(cuò),找不到指定的jar文件,spring-cloud和spring-boot版本要配套,從官網(wǎng)或者對(duì)應(yīng)版本,解決;
3、搭建eureka,eureka-sever能夠正常啟動(dòng);但是eureka-client不能注冊到server,一直報(bào)錯(cuò),There was a problem with the instance info replicator com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server.嘗試更換spring-boot和cloud版本,未解決。
4、ZooKeeper典型應(yīng)用場景
ZooKeeper 是一個(gè)高可用的分布式數(shù)據(jù)管理與協(xié)調(diào)框架。基于對(duì)ZAB算法的實(shí)現(xiàn),該框架能夠很好地保證分布式環(huán)境中數(shù)據(jù)的一致性。也是基于這樣的特性,使得 ZooKeeper 成為了解決分布式一致性問題的利器。
2018.06.25
1、優(yōu)化開發(fā)(DEV)、測試(QA)、運(yùn)維(OPS)的流程,開發(fā)運(yùn)維一體化,通過高度自動(dòng)化工具與流程來使得軟件構(gòu)建、測試、發(fā)布更加快捷、頻繁和可靠。
里面兩個(gè)核心點(diǎn)是:持續(xù)集成與持續(xù)交付
1)持續(xù)集成:
CI是一種將被測代碼頻繁集成到項(xiàng)目穩(wěn)定分支的做法。所謂的”被測代碼”,指的是單獨(dú)分支上開發(fā)的功能,因此這部分的代碼會(huì)被測試然后集成在主線上。
持續(xù)集成是指軟件個(gè)人研發(fā)的部分向軟件整體部分交付,頻繁進(jìn)行集成以便更快地發(fā)現(xiàn)其中的錯(cuò)誤。
2)持續(xù)交付:
持續(xù)交付在持續(xù)集成的基礎(chǔ)上,將集成后的代碼部署到更貼近真實(shí)運(yùn)行環(huán)境的「類生產(chǎn)環(huán)境」(production-like environments)中。持續(xù)交付優(yōu)先于整個(gè)產(chǎn)品生命周期的軟件部署,建立在高水平自動(dòng)化持續(xù)集成之上。
3)持續(xù)部署:
持續(xù)部署是指當(dāng)交付的代碼通過評(píng)審之后,自動(dòng)部署到生產(chǎn)環(huán)境中。持續(xù)部署是持續(xù)交付的最高階段。這意味著,所有通過了一系列的自動(dòng)化測試的改動(dòng)都將自動(dòng)部署到生產(chǎn)環(huán)境。
4)“開發(fā)人員提交代碼,持續(xù)集成服務(wù)器獲取代碼,執(zhí)行單元測試,根據(jù)測試結(jié)果決定是否部署到預(yù)演環(huán)境,如果成功部署到預(yù)演環(huán)境,進(jìn)行整體驗(yàn)收測試,如果測試通過,自動(dòng)部署到產(chǎn)品環(huán)境,全程自動(dòng)化高效運(yùn)轉(zhuǎn)?!?br>
https://www.cnblogs.com/zhuwenlubin/p/5888498.html
2、1)Optional.of(T value),該方法通過一個(gè)非 null 的 value 來構(gòu)造一個(gè) Optional,返回的 Optional 包含了 value 這個(gè)值。對(duì)于該方法,傳入的參數(shù)一定不能為 null,否則便會(huì)拋出 NullPointerException。
2)Optional.ofNullable(T value),該方法和 of 方法的區(qū)別在于,傳入的參數(shù)可以為 null —— 但是前面 javadoc 不是說 Optional 只能包含非 null 值嗎?我們可以看看 ofNullable 方法的源碼:
原來該方法會(huì)判斷傳入的參數(shù)是否為 null,如果為 null 的話,返回的就是 Optional.empty()。
3)Optional.empty(),該方法用來構(gòu)造一個(gè)空的 Optional,即該 Optional 中不包含值 —— 其實(shí)底層實(shí)現(xiàn)還是 如果 Optional 中的 value 為 null 則該 Optional 為不包含值的狀態(tài),然后在 API 層面將 Optional 表現(xiàn)的不能包含 null 值,使得 Optional 只存在 包含值 和 不包含值 兩種狀態(tài)。
3.matches() 方法用于檢測字符串是否匹配給定的正則表達(dá)式。
調(diào)用此方法的 str.matches(regex) 形式與以下表達(dá)式產(chǎn)生的結(jié)果完全相同:
Pattern.matches(regex, str)
4.一個(gè)接口有兩個(gè)實(shí)現(xiàn)類,
1) @Resource(name = "manImpl")//注意是manImpl不是ManImpl,因?yàn)槭褂聾Service,容器為我們創(chuàng)建bean時(shí)默認(rèn)類名首字母小寫
2)@Autowired @Qualifier("manImpl")
5.Mybatis動(dòng)態(tài)SQL Parameter 'name' not found. Available parameters are [arg1, arg0, param1, param2]
1)將語句中的具體參數(shù)名稱改為param1,param2即可。
- 采用map傳遞參數(shù)parameterType="Map"