spring Cloud 環境搭建 學習筆記



spring Cloud-->
spring boot 簡化xml配置,快速整合框架
spring cloud 解決一套微服務解決方案 --RPC遠程調用
配置管理、註冊中心eureka zk、服務發現、服務註冊、斷路器、路由策略、負載均衡、全局鎖、客戶端調用、接口網關zuul、服務管理系統


springCloud註冊中心環境搭建-->euraka
rest、feign 客戶端調用工具
spring Eureka服務註冊中心
負載均衡使用 ribbon    負載均衡 分別有: nginx 、Lvs、HAproxy、F5、SpringCloud也實現了負載均衡
接口網關springZuul :作用是攔截請求,類似nginx。
分佈式配置中心,spring config
springCloud hystrix斷路器


搭建eurka-server

<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.sourcEncoding>UTF-8</project.build.sourcEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId> 
</dependency> 
<dependency>//spring boot test
<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>Sring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>


application.yml
eureka:instance:hostname:localhost //eureka接口名稱
eureka:client:registerWithEureka:false
eureka:client:fetchRegistry:false
eureka:client:serviceUrl:defaultZone:http://${eureka.instance.hostname}:${server.port}/eureka/
server:port:8888 //eureka項目工程端口號8888
spring:application:name:service-member
 
@SpringBootApplication
@EnableEurekaServer //支持Eureka
public class EurekApp{
public static void main(String[]args){
SpringApplication.run(EurekaApp.class,args);
}
}
http://127.0.0.1:8888   啓動後訪問 Eureka管理界面
新建mave jar類型工程


搭建eurela 會員服務項目:sservice-member
<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.sourcEncoding>UTF-8</project.build.sourcEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>//web組建
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>test</scope>
</dependency>
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</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>


application.yml
eureka:client:serviceUrl:defaultZone:http://loaclhost:8888/erueka/  //註冊到eureka server裏面 的地址
server:port:8762 //erueka member端 端口8762
spring:application:name:service-member //提供的erueka member名 用的時候如"http://service-member/getMemberAll"


@RestController //返回json格式的contraller
public class MemberController{
@RequestMapping("/getMemberAll")
public List getMemberAll(){
List list = new ArreyList();
list.add("aaaaa");
return list;
}
}


@SpringBootApplication
@EnableEurekaClient
public class MemberApp{
public static void main(String[] args){
SpringApplication.run(MemberApp.class,args);
}
}
//啓動EurekApp和MemberApp 後,在localhost:8888  會顯示service-member服務
//訪問12.0.0.1:8762/getMemberAll   會顯示aaaaa


新建訂單系統:service-order
服務調用使用 rest、feign 使用httpClient技術調用
負載均衡使用 ribbon


新建訂單系統:
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> 
</dependency> 
<dependency>//web組建
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>test</scope>
</dependency>
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency> //負載均衡
<groupId>org.springframework.boot</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>


application.yml
eureka:client:serviceUrl:defaultZone:http://loaclhost:8888/erueka/  //註冊到eureka server 裏面
server:port:8764 //order端 端口8764
spring:application:name:service-order //order端 提供的服務名


@Service
public class OrderMemberService{
  @Autowired
  private RestTemplate restTemplate;
  public List<String> getOrderUserAll(){
    return restTemplate.getForObject("http://service-member/getMemberAll", List.class);
  }
}


@RestController
public class OrderController{
  @Autowired
  private OrderMemberService orderMemberService;
  @RequestMapping("/getOrderUserAll")
  public List<String> getOrderUserAll(){
    Systm.out.println("訂單服務開始調用會員服務");
    return orderMemberService.getOrderUserAll();
  }
}


@EnableEurekaClient
@SpringBootApplication
public class OrderApp{
public static void main(String [] args){
SpringApplication.run(OrderApp.class,args);
}
@Bean //把類rest模板注入到bean容器中去
@LoadBalanced //支持負載均衡 啓動ribbon
RestTemplate restTemplate(){
return new RestTemplate();
}
}
//啓動EurekApp和MemberApp、OrderApp 後,在localhost:8888  會顯示service-member、service-order服務
//訪問12.0.0.1:8764/getOrderUserAll   會顯示aaaaa,因爲調用了member端的getMemberAll


負載均衡rebbon在order裏面配置
1.會架設多個服務器service-member:8762
2.rebbon進行負載均衡,
3.order端當發送一個請求到rebbon,rebbon會獲取到多個service-member:8762,
rebbon進行輪訓到其中一個service-member:8762


1。order訪問註冊中心eureka 再訪問到member
2。order用名稱service-member訪問註冊中心eureka,
   eureka使用service-member映射到真實ip地址,ip交給order
3。order有了真實地址 從而訪問到了member
====end spring Eureka註冊中心


負載均衡 分別有: nginx 、Lvs、HAproxy、F5、SpringCloud也實現了負載均衡


接口網關springZuul :作用是攔截請求,類似nginx。
任何請求交給接口網關zuul,再由接口網關zuul轉發給註冊中心,類似nginx反向代理
使用項目名稱區分接口網關 轉發到實際地址,解決跨域問題。


搭建spring zuul接口網關項目:service-newzuul


<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.sourcEncoding>UTF-8</project.build.sourcEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>//web組建
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>test</scope>
</dependency>
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</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>Sring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
application.yml
#eureka:instance:hostname:localhost //eureka接口名稱
#eureka:client:registerWithEureka:false
#eureka:client:fetchRegistry:false
eureka:client:serviceUrl:defaultZone:http://localhost:8888/eureka/  //網關注冊到註冊中心的地址
server:port:8769 //zuul項目工程端口號8769
spring:application:name:service-zuul  //zuul註冊名稱
zuul:routes:api-a:path:/api-member/**   //只要api-member開頭的url都跳轉到service-member
zuul:routes:api-a:service-id:service-member
zuul:routes:api-b:path: /api-order/**
zuul:routes:api-a:service-id: service-order


@EnableZuulProxy  //開啓網關
@EnableEurekaClient
@SpringBootApplication
public class AppZuull{
  public static void main(String[]args){
  SpringApplication.run(AppZuull.class,args);
  }
}
A、B 服務,怎麼保證B服務只允許有A服務進行訪問


----
分佈式配置中心,搭建config_service環境
<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.sourcEncoding>UTF-8</project.build.sourcEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR6</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>Sring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>


application.properties
spring.application.name=config-server
server.port=8889
spring.cloud.config.server.git.uri=https://gitee.com/itmayi/cfg2.git
spring.cloud.config.server.git.searchPaths=respo
spring.cloud.config.label=msater
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=


@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication{
public static void main(Sring [] args){
SpringApplication.run(ConfigServerApplication.class,args);
}
}
啓動後訪問地址: http://localhost:8889/foo/dev 


創建config client端項目:config-client


<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.sourcEncoding>UTF-8</project.build.sourcEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>//eureka server
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId> //eurela server 是spring-cloud-starter-eureka-server
</dependency> 
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config</artifactId> //config server 是spring-cloud-config-server
</dependency> 
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>//spring boot test
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</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>Sring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>


bootstrap.properties
spring.application.name=config-client
spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:8889/
server.port=8881


@RestController
public class TestController{
@Value("${userName}") //將git中配置好的變量 注入到此 
private String userName;
@RequestMapping("/getUserName")
public String getUserName(){
return userName;
}
}
@SpringBootAppLication
public class NewClientApp{
public static void main(Sring []args){
SpringApplication.run(NewClientApp.class,args);
}
}  訪問項目 http://127.0.0.1:8881/getUserName




客戶端調用 rest ,feign(常用,自帶負載均衡ribbon,自動開啓 )
創建 feign項目 :
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
application.yml
eureka:client:serviceUrl:defaultZone:http://localhost:8888/eureka/
server:port:8765
server:tomcat:max-threads: 50 //tomcat最大支持50個線程 
spring:application:name:service-order-feign


@FeignClient(value="service-member")
public interface MemberFeign{
@RequestMapping("/getMemberAll")
public List getToOrderMemberAll();
}
@RestController
public class OrderFeginController{
@Autowired
private MemberFeign memberFeign;
@RequestMapping("/getToOrderMemberAll")
public List getToOrderMemberAll(){
System.out.println("order fegin 工程調用 member工程");
return memberFeign.getToOrderMemberAll();
}
}
@SpringBootApplication //注入到springboot管理 
@EnableEurekaClient //註冊到 eureka
@EnableFeignClients //啓動Feign客戶端 
public class OrderFeign{
public static void main(Sting[] args){
SpringApplication.run.(OrderFeign.class,args);
}
}


服務的雪崩效應 hystrix,容斷機制 、服務 降級、服務限流、解決服務雪崩效應
1.使用超時機制、服務降級(發生超時異常時,不去調用接口,調用本地fallback)
jMeter做壓力測試 如:發送100個併發請求 。
產生服務堆積
2.容斷機制,如果一個目標服務調用慢或者有大量超時 時,容斷該服務的調用,對於後續調用請求不在調用目標服務,直接返回,快速釋放資源。如果目標服務情況好轉則回覆調用。
隔離機制 --例如對不同類型的請求使用線程池來資源隔離,每種類型的請求互不影響,如果一種類型請求線程資源耗盡,則對後續的該類請求直接返回,例如將服務拆開,對於重要的服務使用單獨服務器部署。
限流機制--主要是提前對各個類型的請求設置最高的QPS閥值 訪問次數,若高於閥值則對該請求直接返回,不再調用後續資源,這種模式不能解決服務依賴的問題,只能解決系統整體資源分配問題,因爲沒有被限流的請求依然可能造成雪崩效應。上面的容斷機制、隔離機制都屬於出錯後的容錯處理機制,而限流模式則爲預防模式。
    限流機制 使用nginx實現,使用網關zuul實現


springCloud hystrix斷路器
使用原有項目:order-fgin
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
application.yml
feign:hystrix:enabled: true //開啓hystrix
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 4000  //接口超時時間4秒 ,微服務一般是10秒 或5秒


@FeignClient(value="service-member", fallback=MemberFallBack.class) //連接超時、報錯,都會訪問MemberFallBack
public interface MemberFeign{
@RequestMapping("/getMemberAll")
public List getToOrderMemberAll();
}
@Component
public class MemberFallBack implements MemberFeign{
public List getToOrderMemberAll(){
//服務的降級處理
List list = new ArrayList();
list.add("服務發生異常。。");
return list;
}
}


@SpringBootApplication //注入到springboot管理 
@EnableEurekaClient //註冊到 eureka
@EnableFeignClients //啓動Feign客戶端 
public class OrderFeign{
public static void main(Sting[] args){
SpringApplication.run.(OrderFeign.class,args);
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章