1. 程式人生 > >Java架構學習(四十)SpringCloud基礎&網站架構演變&微服務架構概述&SpringCloud概述&服務註冊與服務發現&搭建註冊中心Euraka&rest和fegin呼叫原理

Java架構學習(四十)SpringCloud基礎&網站架構演變&微服務架構概述&SpringCloud概述&服務註冊與服務發現&搭建註冊中心Euraka&rest和fegin呼叫原理

一、網站架構演變過程

微服務架構 為什麼出現了SpringCloud
網站架構模式:
單點應用---->分散式系統面向於服務架構(SOA)體系 webservice---->微服務架構

web專案三層架構

在這裡插入圖片描述

如果在網際網路公司中,使用傳統架構技術開發會產生程式碼衝突。
所以需要拆分專案:
這就產生了分散式開發

分散式架構:就是將一個大專案,拆分成n個多個子專案。
如:會員系統、支付系統、訊息系統、微信系統

叢集:將同一個專案,部署在多個伺服器上。war包都相同



面向服務架構優點:程式碼服務、解耦、只適合大公司,人多的情況下使用。
缺點:網路延遲、分散式事務問題
小公司傳統專案:

分散式架構系統:就是將一個大專案,拆分成n多個子專案,
再使用rpc遠端呼叫技術。
你用過哪些rpc遠端呼叫框架:
springCloud、Dubbo、HttpClient、Hessian
SOA:面向於服務架構
通訊協議SOAP:就是Http協議+xml傳輸的。反序列化與反序列化。

二、微服務架構概述

1、微服務架構(分散式架構):是在傳統的SOA架構領域升級的。
	微:就是細分
	輕量級、通訊協議是Http協議+restful分格+json
	來源:

在這裡插入圖片描述

注意:每一個服務都對應著一個數據庫

RPC遠端呼叫:使用http協議+json格式+restful分格
使用比較簡單的通訊就是使用httpclient
介面只能允許在內網訪問和外網進行介面對接。
主流的rpc解決框架:dubbo 、springCloud

微服務架構與面向服務架構區別:
面向與服務架構SOA:主要針對銀行裡面,xml格式。企業級的傳統專案
微服務系統中:會更加細分。http+json+restful輕量級。獨立執行

三、SpringCloud概述

1、介面地址怎麼管理?有沒有容錯機制?負載均衡、閘道器、路由策略、
 介面限流、斷路。
 微服務解決框架:SpringCloud
 SpringCloud解決什麼樣的問題?
 答:SpringCloud是做rpc遠端呼叫的、配置管理、註冊中心(Eureka、ZK)、
 服務發現(表示服務可以被別人呼叫) 服務註冊、斷路器、路由策略、負載均衡、
 全域性鎖、分散式會話系統、客戶端呼叫。
 介面閘道器(ZUUL)、服務管理系統。
 SpringBoot與SpringCloud區別?
 答:SpringBoot是簡化xm配置的,能快速整合框架
 		SpringCloud是一套微服務解決方案,主要用在RPC遠端呼叫。

關係是SpringCloud依賴介面(SpringMVC)與SpringBoot來實現的。

四、服務註冊與服務發現

1、SpringCloud註冊中心環境搭建 euraka
2、服務的註冊與發現
3、SpringCloud客戶端呼叫:rest呼叫、feign呼叫:客戶端呼叫
	  ribbon:負載均衡。
	 zuul:介面閘道器。
	 euraka:服務註冊。

案例:
會員服務提供使用者資訊
訂單服務:查詢訂單
訂單服務需要查詢使用者,訂單服務呼叫會員介面。

在這裡插入圖片描述

五、搭建註冊中心 euraka

	註冊中心的作用:管理服務的。
	 
案例環境搭建:
第一步:搭建註冊中心euraka
第二步:搭建介面提供工程
第三步:使用介面
一、搭建Eureka註冊中心

pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.leeue</groupId>
	<artifactId>eureka-server</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<!--eureka server -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
		</dependency>
		<!-- spring boot test -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.RC1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
</project>
2、application.yml檔案
server:
  port: 8888
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
#    eureka地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啟動類
package com.leeue.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer   //這個就是服務
public class EurakaApp {
	public static void main(String[] args) {
		SpringApplication.run(EurakaApp.class, args);
	}
}

執行效果:

在這裡插入圖片描述

二、搭建服務提供者  介面提供  service-member
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.leeue</groupId>
	<artifactId>39_service-member</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.RC1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
</project>
application.yml
# 配置註冊中心地址  
eureka:
  client:
    serviceUrl:
#    地址  加上/eureka
      defaultZone: http://localhost:8888/eureka/
server:
  port: 8762
spring:
  application:
    name: service-member
啟動類:
package com.leeue;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient  //表示註冊到註冊中心裡面去
public class MemberApp {
	public static void main(String[] args) {
		
		SpringApplication.run(MemberApp.class, args);
	}
}
啟動類
package com.leeue;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient  //表示註冊到註冊中心裡面去  注意是client
public class MemberApp {
	public static void main(String[] args) {
		
		SpringApplication.run(MemberApp.class, args);
	}
}
執行後在eureka裡面會找到這個服務

在這裡插入圖片描述

三、消費會員服務
服務呼叫使用:rest、feign
負載均衡使用ribbon

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.leeue</groupId>
	<artifactId>39_service-order</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.RC1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
</project>
application.yml
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8888/eureka/
server:
  port: 8764
spring:
  application:
    name: service-order
service
package com.leeue.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;


/**
 * 使用rest方式呼叫介面
 * @classDesc: 功能描述:()
 * @author:<a href="[email protected]">李月</a>
 * @Version:v1.0
 * @createTime:2018年11月2日 下午4:44:55
 */
@Service
public class OrderMemberService {
	@Autowired
	private RestTemplate restTemplate;  //注入rest模版
	
	public List<String> getOrderUser(){
		
		return restTemplate.getForObject("http://service-member/getMemberAll", List.class);
	}
}

control
package com.leeue.control;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.leeue.service.OrderMemberService;

@RestController
public class OrderController {
	@Autowired
	OrderMemberService orderMemberService;
	@RequestMapping("/getOrderAll")
	public List<String> getOrderAll(){
		System.out.println("訂單服務呼叫會員服務");
		return orderMemberService.getOrderUser();
	}
}
啟動類  啟動類要注意  注入@RestTemplate 
package com.leeue;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class OrderApp {
	public static void main(String[] args) {

		SpringApplication.run(OrderApp.class, args);
	}

	/**
	 * 下面程式碼是 把
	 * @return
	 */
	@Bean //把ResTemplate注入到 Spring容器中去
	@LoadBalanced //表示支援負載均衡
	RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

六、SpringCloud中rest、fegin呼叫原理

底層使用的技術原理分析:底層還是使用httpclient來呼叫。
兩個服務都註冊到註冊中心,地址也在註冊中心,如果一個服務要呼叫另一個服務,
就在註冊中心獲取到地址,然後本地使用httpclient進行請求資源。

在這裡插入圖片描述