1. 程式人生 > >樂優商城第二天(Springcloud上)

樂優商城第二天(Springcloud上)

Today is 樂優商城的第二天,學習了系統架構的發展,微服務和springcloud的Eureka,每天學新東西都是多的,但是一想到我們的專案不是淘淘商城了,是一個全新的專案,就充滿希望,想把這個全新的專案學好。

一.系統架構的演進

1.集中式架構,所有的模組都耦合在一起

2.垂直拆分,分家,各模組相對獨立,但是每一個模組都直接和資料庫打交道,產生了很多重複的工作

3.分散式服務,將系統的基礎服務進行抽取,各個業務都可以呼叫這些服務,提高了程式碼服用和開發效率。但是缺乏統一管理,相當於每一個模組都是直接和那些基礎服務打交道的。導致關係錯綜複雜。

4.SOA面向服務,有一個統一的註冊中心來管理服務。

5.微服務,服務拆分的更小。

二.服務呼叫的方式

既然發展到微服務,那麼服務之間是怎麼通訊的?

兩種方式:1.RPC和Http

RPC遠端服務呼叫,將請求序列化,通過網路傳輸,在接收端進行反序列化解析,拿到引數,執行方法,再將結果序列化返回

Http則通過http協議進行通訊,資訊封裝在請求行,請求頭,請求體中。

從三個方向比較

1.速度 RPC速度更快

2.難度 RPC更難實現,http簡單

3.靈活度 http通過rest風格的連結相互呼叫,RPC需要更服務之間用相同的語言,因為傳入的引數,方法可以接手。並且約定好序列化和反序列化的方式

我們追求自由,不喜歡收到多的限制,所以我們選擇基於Http的Rest風格的服務。

三.JAVA程式碼如何處理HTTP請求?(Http客戶端工具)

主流有三種:

  • HttpClient

  • OKHttp

  • URLConnection

客服端傳送請求http請求,並接受響應。這裡以HttpClient為例,看java程式碼中如何使用HttpClient傳送http請求的

在使用HttpClient之前,需要先建立物件

CloseableHttpClient httpClient;
@Before
public void init() {
httpClient = HttpClients.createDefault();
}

如果是get請求,傳送請求request得到響應response

HttpGet request = new HttpGet("http://localhost:8081/list"
); String response = this.httpClient.execute(request, new BasicResponseHandler());

就相當於用一個類進行傳送請求和得到響應

這樣會相當麻煩,因為不同的客戶端需要編寫不同的程式碼,而spring給我們提供了一個通用的模版,restTemplate,她是對常用客戶端的一個簡單封裝,我們只要寫通用的程式碼就可以實現傳送請求和得到響應,用法如下:

首先將RestTemplate交給IOC管理,我們使用的是okHttp3ClientHttpRequestFactory

@Bean
public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}

建立完物件後,restTemplate可以直接傳送請求,並將響應解析成物件

得到普通物件:

User user = this.restTemplate.getForObject("http://localhost:8081/hello", User.class);

得到集合:

List<User> list = restTemplate.getForObject("http://localhost:8081/list", List.class);

四.模擬服務提供者和消費者

  當我們可以在java中處理http請求後,我們就可以模擬一個服務提供者和消費者的案例。

消費者通過restTemplate傳送http請求,得到響應。但是,這樣會產生問題,

1.http請求都是被硬編碼到消費者裡面的,如果我們的請求地址發生變化,我們還得去java程式碼裡面去更改。

2.不利於擴充套件,這樣始終只有一個服務提供者為我服務,我想要一個叢集為我服務,這個壞了,我還可以用裡一個備用的,還可以達到負載均衡的目的。

因為有這樣的需求,我們需要一個管理者。而這個管理者是springcloud給我們提供的eureka

五.註冊中心Eureka

我們對消費者和服務進行改造,服務提供者去註冊中心去註冊服務,消費者去註冊中心去拉取服務。這樣,一切都清晰起來,消費者不需要知道服務的提供者是誰,只需要知道他需要什麼服務。服務提供者也不需要知道他為誰服務,只需要把服務交個註冊中心就行了。


那麼,我們想實現這個邏輯,肯定先得有個註冊中心,所以註冊中心必須先準備好。

  • 搭建服務中心

註冊中心是springcloud的一個元件,我們得引入springcloud,我們可以用idea的springInitializr快速構建一個springboot專案,並引入依賴,而如果只有一個註冊中心,不安全,我們為了高可用性,一般會有多個註冊中新,他們互相註冊,讓彼此知道對方的存在。這需要在配置檔案中配置,具體配置如下:

server:
  port: 10086 # spring:
  application:
    name: eureka-server # 應用名稱,會在Eureka中顯示
eureka:
  client:
    service-url: # 配置其他Eureka服務的地址,而不是自己,比如10087
defaultZone: http://127.0.0.1:10087/eureka

配置檔案配置好之後,我們需要啟動eureka服務,而spring並不知道我們這是一個eureka服務,於是我們需要告訴程式,我們是一個eureka服務,方式就是引入註解。

@SpringBootApplication
@EnableEurekaServer
在啟動類上面再加一個@EnableEurekaServer註解

這樣,註冊中心就搭建完成了。

  • 搭建服務提供者

註冊中心搭建完成後,顯然下一個就是搭建服務,讓服務去註冊中心去註冊,最後才是消費者去註冊中心拉取服務,那麼我們開始服務的搭建。步驟跟搭建註冊中心差不多,1.寫配置檔案,2.啟動的時候,告訴啟動類,去註冊中心註冊自己

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/day0308
    username: root
    password: 123
    hikari:
      maximum-pool-size: 20
minimum-idle: 10
application:
    name: user-service # 應用名稱
eureka:
  client:
    service-url: # EurekaServer地址
defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka
  instance:
    lease-expiration-duration-in-seconds: 10 # 10秒即過期
lease-renewal-interval-in-seconds: 5 # 5秒一次心跳
prefer-ip-address: true # 當呼叫getHostname獲取例項的hostname時,返回ip而不是host名稱
ip-address: 127.0.0.1 # 指定自己的ip資訊,不指定的話會自己尋找
mybatis:
  type-aliases-package: com.cloud.pojo

主要配置了服務的id,註冊中心的地址,還有心跳。

@SpringBootApplication
@MapperScan("com.cloud.mapper")
@EnableDiscoveryClient

啟動類新增的註解

  • 搭建消費者

消費者其實也相當於一個服務,也需要去註冊中心註冊,所以他的搭建方法跟服務提供者差不多

server:
  port: 8082
spring:
  application:
    name: consumer 
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true 
    ip-address: 127.0.0.1 
@SpringBootApplication
@EnableDiscoveryClient

消費者去註冊中心獲取服務的方法

@Autowired
private DiscoveryClient discoveryClient;
public User queryUserById(Long id) {
List<ServiceInstance> instances = discoveryClient.getInstances("USER-SERVICE");
ServiceInstance serviceInstance = instances.get(0);
通過instances可以獲得instances,通過instances可以獲得埠號和ip,這樣就能拼接得到url,這就是eurake的作用。當然後面的負載均衡我們連instance都不需要了,直接寫服務地址就好了。

其他:

1.在不用restTemlate的情況下,怎麼將json轉化為物件?

首先注入mapper物件

ObjectMapper mapper;
@Before
public void init() {
mapper = new ObjectMapper();
}

對於普通java類

 User users = mapper.readValue(response,User.class);

對集合

List<User> users = mapper.readValue(response, mapper.getTypeFactory().constructCollectionType(List.class, User.class));
另外,對mapper類我們採取了封裝工具類,在我的工具類中可以找到

2.ymal語法

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb01
    username: root
    password: 123
    hikari:
      maximum-pool-size: 20
      minimum-idle: 10
mybatis:

  type-aliases-package: com.leyou.userservice.pojo

代替properties檔案

3.JDK8新特性lambda表示式  

ids.forEach(id -> {
// 我們測試多次查詢,
users.add(this.restTemplate.getForObject(url + id, User.class));
// 每次間隔500毫秒
try {
Thread.sleep(500);
    } catch (InterruptedException e) {
e.printStackTrace();
    }
});

對ids這個集合進行forech遍歷,這樣就代替了foreach

下面連線是大佬對lambda的理解:

https://blog.csdn.net/ioriogami/article/details/12782141/

相關推薦

商城第二Springcloud

Today is 樂優商城的第二天,學習了系統架構的發展,微服務和springcloud的Eureka,每天學新東西都是多的,但是一想到我們的專案不是淘淘商城了,是一個全新的專案,就充滿希望,想把這個全新的專案學好。一.系統架構的演進1.集中式架構,所有的模組都耦合在一起2.

商城第一Springboot

傳智部落格的的新專案樂優商城,很幸運可以學新專案,哈哈哈 我們是第一期學到樂優商城的,真的好爽。當得到訊息,我們第一個專案是樂優商城的時候,我都激動死了,感覺可以學到時髦的springboot和springcloud真是再好不過的事情。可是,我們班有些人竟然說自己是小白鼠,

網路程式設計 第二 TCP程式設計

在網路應用程式程式設計時,伺服器與客戶機的執行邏輯不同,因此伺服器端與客戶端的程式碼也不同。 一、TCP程式設計——伺服器端 使用TCP通訊的伺服器端的程式設計流程如下: 如果需要使用TCP協議建立一個伺服器,則需要以下步驟:     -建立套接字     

商城第十八授權中心與登陸

很早之前,聽人家做淘淘商城的人一直說單點登入,但是一直不明白單點登陸是什麼,看百度百科如果是這樣的話,那麼我們這個應該也算是一種單點登陸的解決方案。我們的登陸是服務端無狀態的登陸採用jwt+rsa對稱式加密演算法來生成一個令牌,儲存在瀏覽器,瀏覽器下次可以通過攜帶cookie

商城第九天,第十商品規格引數模版的新增,商品的新增

樂優商城第9,10兩天,商品的新增,是整個後臺系統最難的地方,尤其是前端頁面,這裡把中心放在後端程式碼和業務邏輯上spu是一種商品的總稱,比如小米8sku是細分領域,比如xiaomi8 星空黑64G商品的新增涉及4張表,spu,spudetail,sku,store其實就是兩

商城第十二Elasticsearch

spring data Elasticsearch1.匯入依賴<dependencies> <dependency> <groupId>org.springframework.boot</groupId>

商城三十九—— 訂單中心

目錄 一、我的訂單頁 1.1. 頁面效果 1.2 後臺介面 1.3 頁面改造 1.3.1 資料載入 1.3.2 分頁條 1.4 測試 1.5 訂單狀態過濾 1.5.1 全部訂單(16) 1.5.2 待付款(3) 1.5.3 待發貨(4) 1.5.4 待

商城三十八——訂單微服務

目錄 五、地址管理 5.1 頁面效果 5.2 資料庫表設計 5.3 頁面優化 5.3.1 在data中定義資料 5.3.2 模態框 5.3.3 方法繫結 5.3.4 效果展示 5.4 後臺介面 5.4.1 實體類 5

商城三十七——訂單微服務

目錄 四、細節優化 4.1 支付頁面顯示總金額 4.1.1 支付頁面 4.1.2 支付成功頁面 4.2 修改訂單號的傳遞方式 4.2.1 修改訂單提交函式 4.2.2 修改支付頁面 4.3 訂單提交時進行登入認證 4.4 本地資料刪除 4.5 購物車資料更新

商城三十六——訂單微服務

目錄 二、訂單結算頁 2.1 頁面跳轉 2.2 收貨人資訊 2.3 支付方式 2.4 商品列表 2.4.1 購物車資訊獲取 2.4.2 頁面渲染 2.5 總金額 2.6 提交訂單 2.6.1 頁面提交 2.6.2 精度損失問題 三、微信支付 3.1

商城三十四——訂單微服務

目錄 一、建立訂單微服務 1.1 建立module 1.2 pom依賴 1.3 配置檔案 1.4 啟動類 1.5 配置匯入 1.6 屬性讀取 1.7 支付工具類 1.8 修改閘道器配置 二、實體類準備 2.1 Order.java 2.2 OrderD

商城三十五——訂單微服務

目錄 一、訂單系統介面 1.1 Swagger-UI 1.1.1 什麼是OpenApi 1.1.2 什麼是Swagger 1.1.3 快速入門 1.2 測試介面 1.2.1 建立訂單介面 1.2.2 生成ID方式 1.2.3 查詢訂單介面

商城三十三——購物車

目錄 四、已登入購物車 4.1 新增登入校驗 4.1.1 引入JWT相關依賴 4.1.2 配置公鑰 4.1.3 載入公鑰 4.1.4 編寫攔截器 4.1.5 配置攔截器 4.1.6 編寫過濾器 4.1.7 配置過濾器 4.2 後臺購物車設計 4.3 新增商

商城三十二——購物車

目錄 一、搭建購物車微服務 1.1 建立module 1.2 pom依賴 1.3 配置檔案 1.4 啟動類 二、購物車功能分析 2.1 需求 2.2 流程圖 三、未登入購物車 3.1 準備 3.1.1 購物車的資料結構 3.1.2 web本地儲存

商城三十一——授權中心

目錄 三、首頁判斷登入狀態 3.1 頁面程式碼 3.2 後臺實現校驗使用者介面 3.3 測試 3.4 重新整理token 四、閘道器的登入攔截 4.1 引入jwt相關配置 4.2 編寫過濾邏輯 4.3 白名單 三、首頁判斷登入狀態 雖然cookie已經

商城三十——授權中心

目錄 一、無狀態登入原理 1.1 什麼是有狀態 1.2 什麼是無狀態 1.3 如何實現無狀態 1.4 JWT 1.4.1 簡介 1.4.2 資料格式 1.4.3 JWT互動流程 1.4.4 非對稱加密 1.5 結合Zuul的鑑權流程 1.5.1 沒有RSA

商城二十九——使用者註冊

目錄 七、根據使用者名稱和密碼查詢使用者 7.1 介面說明 7.2 Controller 7.3 Service 7.4 測試 八、在註冊頁進行測試 七、根據使用者名稱和密碼查詢使用者 7.1 介面說明 功能描述:查詢功能,根據引數中的使用者名稱和密碼查詢指定

商城二十八——使用者註冊

  五、傳送簡訊功能 5.1 介面說明 功能描述:根據使用者輸入的手機號,生成隨機驗證碼,長度為6位,純數字。並且呼叫簡訊服務,傳送驗證碼到使用者手機。 介面路徑:POST /code 引數說明: 引數 說明

淘淘商城第二—完成商品新增功能 商品類目選擇 圖片傳 圖片伺服器搭建 kindEditor富文字編輯器的使用 商品新增功能

1、實現商品類目選擇功能 1.1需求 在商品新增頁面,點選“選擇類目”顯示商品類目列表: 請求初始化樹形控制元件的url:/item/cat/list 1.2 EasyUI tree資料結構 資料結構中必須包含: Id:節點id Text:節

商城二十三——商品詳情及靜態化

目錄 2.1 簡介 二、頁面靜態化 2.1 簡介 2.1.1 問題分析 現在的頁面是通過Thymeleaf模板引擎渲染後返回到客戶端。在後臺需要大量的資料查詢,而後渲染得到HTML頁面。會對資料庫造成壓力,並且請求的響應時間過