springboot + spring cloud----eureka


狂神教學

https://www.bilibili.com/video/BV1jJ411S7xr?p=4

狂神推薦的網站(springcloud 中文手冊)

https://www.springcloud.cc/spring-cloud-dalston.html

maven倉庫

https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies/Greenwich.SR1

 

springboot與springcloud 版本兼容

參考: https://blog.csdn.net/licwzy/article/details/104705189

https://blog.csdn.net/weixin_40902527/article/details/88895793

 

 

Eureka模塊

maven配置

 

 

我是直接用這個 上面自己配的 啟動不了

ide創建 springboot + eureka

https://blog.csdn.net/weixin_46032603/article/details/108774805

 

 

 

 

配置文件 application.yml

server:
 port: 7001
#Eureka配置
eureka:
server:
# 關閉Eureka自我保護機制
enable-self-preservation: true
instance:
hostname: localhost #Eureka配置服務端的實例名稱
client:
register-with-eureka: false #表示是否向eureka注冊中心注冊自己
fetch-registry: false #如果為false, 則表示自己為注冊中心
service-url: #監控頁面 注冊地址 給提供服務的端配置的
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
 

 

SpringbootEurakaApplication  啟動類文件

package com;

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

@SpringBootApplication
@EnableEurekaServer   //服務端的啟動類,可以接受別人注冊進來
public class SpringbootEurakaApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootEurakaApplication.class, args);
    }

}

 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>springboot_euraka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_euraka</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.SpringbootEurakaApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
View Code

 

 

 

提供服務的項目

 

 

 

application.yml 配置文件

#spring的配置
spring:
application:
name: FW01


# 應用服務 WEB 訪問端口
server:
port: 8081


#Eureka配置,服務注冊到那里
eureka:
client:
service-url: #監控頁面 注冊地址
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: FW01-w8081 #修改eureka上的默認描述信息

#點擊服務對應描述信息跳轉到/actuator/info地址 配置你們展示的信息
info:
app.name: lucax-FW01
company.name: lucax.com

Fw01Application 啟動文件

package com;

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

@SpringBootApplication
@EnableEurekaClient //在服務啟動后自動注冊到 Eureka中
@EnableDiscoveryClient //服務發現,加上這個在查看eurka上有那些服務時 也會返回自己
public class Fw01Application {

    public static void main(String[] args) {
        SpringApplication.run(Fw01Application.class, args);
    }

}

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>FW01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>FW01</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
<!-- http://192.168.108.235:8081/actuator/info  ,點eureka里自己的服務 展示信息-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.Fw01Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

 

 

eureka字段展示配置(提供服務端)

 

這個在pom文件要引入

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

 

鼠標放上面展示ip

instance:
instance-id: FW01-w8083-hystrix #修改eureka上的默認描述信息
prefer-ip-address: true #展示ip 我是加不加都展示 神奇

 

 

 

 

------獲取注冊在eureka上面的服務---注意在 Fw01Application 啟動文件 加上注解  @EnableDiscoveryClient 意思就是 查詢注冊在上面的服務 不過濾自己

contorl01

package com.contorl;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
public class contorl01 {
//    獲取一些配置的信息,得到具體的微服務!
    @Autowired
    private DiscoveryClient client;

    @GetMapping("/man")
    public String checkMan() {
        return "獲取人類";
    }

    @GetMapping("/getServer")
    public Object discovery(){
//        獲取微服務的清單
        List<String> services=client.getServices();
        System.out.println("discovery=>services"+services);

//        得到一個具體的微服務信息,通過具體的微服務id,applicationName;
        List<ServiceInstance> instances = client.getInstances("FW01");

        for (ServiceInstance instance:instances){
            System.out.println(
                    instance.getHost()+"\t"+
                    instance.getPort()+"\t"+
                    instance.getUri()+"\t"+
                    instance.getServiceId()
            );
        }

        return this.client;
    }
}

終端打印出 

discovery=>services[fw01]
192.168.108.235 8081 http://192.168.108.235:8081 FW01

 

euraka集群

 

集群設置:

和上面Eureka模塊配置的一樣的,就在配置文件里面配置有點不一樣,配置其他幾個euraka配置的地址即可

application.yml

server:
 port: 7003

#Eureka配置
eureka:
  server:
#    關閉Eureka自我保護機制
    enable-self-preservation: true
  instance:
    hostname: localhost         #Eureka配置服務端的實例名稱
  client:
    register-with-eureka: false   #表示是否向eureka注冊中心注冊自己
    fetch-registry: false  #如果為false, 則表示自己為注冊中心
    service-url:  (#監控頁面 注冊地址--寫上其他幾個euraka配置的注冊地址即可)
      defaultZone:   http://127.0.0.1:7001/eureka/,http://127.0.0.1:7002/eureka/

 

服務提供端:

 application.yml

#Eureka配置,服務注冊到那里
eureka:
  client:
    service-url:  #監控頁面 注冊地址---寫euraka配置的注冊地址
      defaultZone: http://127.0.0.1:7001/eureka/,http://127.0.0.1:7003/eureka/

 

 

 

(客戶端、消費端)負載均衡--ribbon--調用服務--要搭配第三方請求

 

 

實線就是ribbon做的事情

 

使用服務端(消費者)

maven依賴

https://mvnrepository.com/search?q=ribbon

 

 

 

 

 

 

Restemconnfig。       ---------這里用了      restTemplate 庫 見 : https://www.cnblogs.com/kaibindirver/p/15398815.html

package com.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class Restemconnfig {
    @Bean
    @LoadBalanced   //配置負載均衡實現---Ribbon
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

 

RequestUrl

package com.control;


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@Slf4j
@RestController
public class RequestUrl {

    private final String url = "http://FW01"; //這里是服務端在euraka上注冊的 應用名稱
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/XF")
    public String resQuest() {
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(url+"/man", String.class);
        log.info("響應: " + responseEntity);

        String body = responseEntity.getBody();
        log.info(String.valueOf(body));
        return "請求成功";
    }
}

 

 XfApplication

package com;

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


//Ribbon 和 Eureka 整合以后,客戶端可以直接調用,不用關心ip地址和端口號
@SpringBootApplication
@EnableEurekaServer   //服務端的啟動類,可以接受別人注冊進來
public class XfApplication {

    public static void main(String[] args) {
        SpringApplication.run(XfApplication.class, args);
    }

}

 

application.yml

#spring的配置
spring:
  application:
    name: XF

# 應用服務 WEB 訪問端口
server:
  port: 8080

#Eureka配置,服務注冊到那里
eureka:
  client:
    register-with-eureka: false   #表示不向eureka注冊中心注冊自己
    service-url:  #監控頁面 注冊地址
      defaultZone: http://127.0.0.1:7001/eureka/,http://127.0.0.1:7003/eureka/

 

pom

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>XF</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>XF</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.XfApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

 

 上面是他會去找可用的注冊中心中拿服務提供者

 

 

自定義ribbon的負載均衡見下面的教程

https://www.bilibili.com/video/BV1jJ411S7xr?p=12

如果是選擇內置的,則修改Restemconnfig 文件即可

package com.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class Restemconnfig {
    @Bean
    @LoadBalanced   //配置負載均衡實現---Ribbon
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }


//    配置負載均衡實現 RwatTemplate
//    IRule接口下面的方法有
//    RoundRobbinRule 輪詢 (不寫默認是這個)
//    RanndomRule 隨機
//    AvailablityFilteringRule  會先過濾 跳閘 訪問故障的服務~ 對剩下的進行輪詢
//    RetryRule 會先按照輪詢獲取服務,如果服務獲取失敗,則會在指定時間內進行 重試
    @Bean
    public IRule myRule(){
        return new RandomRule(); } 
}

 

 

 

(客戶端、消費端)  feign調用服務端---直接調不需要第三方請求

一般是剝離api為一個mode項目,因為別人項目調用時 就給他api的maven包

 

 后記:

如果調用的服務類上面也有路徑可以這么寫

@FeignClient(value = "服務名稱", path = "類上面的路徑")
public interface Api {
@PostMapping("方法上面的路徑")
  public void aa()

 

 

 

自己實踐,為了方便我api沒有獨立出去

 

 

RequestUrl

package com.control;


import com.server.DeptClict;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class RequestUrl {
    @Autowired private DeptClict service = null; //調feign 鏈接服務提供端---就是下面的接口類 后記: 直接 private DeptClict service 也行
 @GetMapping("/XF") public String resQuest() { return this.service.resQuest(); } }

 DeptClict

package com.server;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;


@Component 
@FeignClient(value="FW01")
public interface DeptClict {
    @GetMapping("/man")       //調用 FW01 服務提供端的 接口   就上面 提供服務的項目 contorl里面的接口
    public String resQuest();
}

注意!!!!!!:

假如調用的接口是要接受參數的,要用正規的寫法 指定接受的值

public String resQuest(@PathVariable("id") String id);

 

 

FeignApplication

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

//Ribbon 和 Eureka 整合以后,客戶端可以直接調用,不用關心ip地址和端口號
@SpringBootApplication
@EnableEurekaServer   //服務端的啟動類,可以接受別人注冊進來
@EnableFeignClients(basePackages = {"com"})    讓他掃描這個包下的文件 feign的注解就會生效  ----后記: 要指定具體的目錄不然IDe報語法錯誤 實際也能跑ffei
//@ComponentScan("com")    這個教程里面說要加 ,但是我沒加也成功,貌似是有啥自定義的才要加這個
class FeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }

}

application.yml

#spring的配置
spring:
  application:
    name: XF

# 應用服務 WEB 訪問端口
server:
  port: 8181

#Eureka配置,服務注冊到那里
eureka:
  client:
    register-with-eureka: false   #表示不向eureka注冊中心注冊自己
    service-url:  #監控頁面 注冊地址
      defaultZone: http://127.0.0.1:7001/eureka/,http://127.0.0.1:7003/eureka/

 

pom

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>feign</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>XF</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.XfApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

 

eureka  自我保護機制的配置:

https://www.cnblogs.com/zjfjava/p/12153130.html

 

hystrix  短路器

 

 

服務熔斷演示-------方法出錯定向另一個方法  (在服務端做)

contorl01

package com.contorl;


import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLOutput;
import java.util.List;

@Slf4j
@RestController
public class contorl01 {
//    獲取一些配置的信息,得到具體的微服務!
    @Autowired
    private DiscoveryClient client;

    @GetMapping("/man/{id}")
    @HystrixCommand(fallbackMethod="HystrixcheckMan")       //這個方法有出錯就執行備用的方法 HystrixcheckMan
    public String checkMan(@PathVariable() String id) {
        if (id.equals("1")){
            log.error("id不能為空");
            throw new RuntimeException("id不能為空");
        }
        return "獲取人類Hystrix服務"+id;
    }

    public String HystrixcheckMan(@PathVariable() String id) {
        return "獲取人類Hystrix服務調用失敗備用方法"+id;
    }
}

Fw03HystrixApplication

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;


@SpringBootApplication
@EnableEurekaClient //在服務啟動后自動注冊到 Eureka中
@EnableDiscoveryClient //服務發現,加上這個在查看eurka上有那些服務時 也會返回自己
//添加對熔斷的支持
@EnableCircuitBreaker
public class Fw03HystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(Fw03HystrixApplication.class, args);
    }

}

 

 

application.yml

#spring的配置
spring:
  application:
    name: FW01


# 應用服務 WEB 訪問端口
server:
  port: 8083


#Eureka配置,服務注冊到那里
eureka:
  client:
    service-url:  #監控頁面 注冊地址
      defaultZone: http://127.0.0.1:7001/eureka/,http://127.0.0.1:7003/eureka/
  instance:
    instance-id: FW01-w8083-hystrix  #修改eureka上的默認描述信息

#點擊服務對應描述信息跳轉到/actuator/info地址 配置你們展示的信息
info:
  app.name: lucax-FW02
  company.name: lucax.com

 

pom

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>FW03-Hystrix</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>FW03-Hystrix</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- http://192.168.108.235:8081/actuator/info  ,點eureka里自己的服務 展示信息-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.Fw01Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

  

 (客戶端做、消費方 )服務降級--就是請求某個類里面的api的時候給他轉到另外一個類返回特定的內容

比方3個服務,現在一個服務要大量用,就可以先關閉其他服務的api

具體例子見 : https://www.bilibili.com/video/BV1jJ411S7xr?p=15

 

 

 

 v

 

 

總結 

hystrix2種方法處理服務器負載問題

流量監控Dashboard--監控進入服務里面的請求(可以布到客戶端)

 https://www.bilibili.com/video/BV1jJ411S7xr?p=16

 

路由網關Zuul

 

通過網關 統一api調用的地方,可實現請求監控 攔截 等等~~

 

 

 

ZuulApplication

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy    //zuul注解開啟zuul網關
public class ZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }

}

  

 

application.yml

#spring的配置
spring:
  application:
    name: ZUUL

# 應用服務 WEB 訪問端口
server:
  port: 9527

#Eureka配置,服務注冊到那里
eureka:
  client:
    service-url:  #監控頁面 注冊地址
      defaultZone: http://127.0.0.1:7001/eureka/,http://127.0.0.1:7003/eureka/

  instance:
    instance-id: zuul9527.com
    prefer-ip-address: true

info:
  app.name: lucax-zuul
  company.name: lucax-company

zuul:
  routes:
    mydept.serviceId: fw01      #微服務名稱 (小寫)      ----正常調用  http://192.168.108.235:9527/fw01/man
    mydept.path: /mydept/**     #替換字段        ----修改后也可以這樣調用 http://192.168.108.235:9527/mydept/man
  ignored-services: fw01          #--------加了這個配置 就不可以使用微服務名稱調用 隱藏全部 "*"
  prefix: /lucax   #設置公共前綴   http://192.168.108.235:9527/lucax/mydept/man

  

 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>ZUUL</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ZUUL</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.XfApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

  

 給zuul 加每個請求調用打印日志的方法

PrintRequestLogFilter

package com.JK;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import org.springframework.util.StreamUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Map;


@Component
public class PrintRequestLogFilter extends ZuulFilter {
    private static final Logger LOGGER = LoggerFactory.getLogger(PrintRequestLogFilter.class);

    @Override
    public String filterType() {
        return FilterConstants.POST_TYPE;//要打印返回信息,必須得用"post"
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        try {
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
            InputStream in = request.getInputStream();
            String reqBbody = StreamUtils.copyToString(in, Charset.forName("UTF-8"));
            // 打印userId,獲取其他用戶信息
            if (reqBbody != null) {
                LOGGER.info(reqBbody);
//                JSONObject json = JSONObject.fromObject(reqBbody);
//                Object userId = json.get("userId");
//                if (userId != null) {
//                    PrintRequestLogFilter.LOGGER.info("request userId:\t" + userId);
//                }
            }
            // 打印請求方法,路徑
            PrintRequestLogFilter.LOGGER
                    .info("request url:\t" + request.getMethod() + "\t" + request.getRequestURL().toString());
            Map<String, String[]> map = request.getParameterMap();
            // 打印請求url參數
            if (map != null) {
                StringBuilder sb = new StringBuilder();
                sb.append("request parameters:\t");
                for (Map.Entry<String, String[]> entry : map.entrySet()) {
                    sb.append("[" + entry.getKey() + "=" + printArray(entry.getValue()) + "]");
                }
                PrintRequestLogFilter.LOGGER.info(sb.toString());
            }
            // 打印請求json參數
            if (reqBbody != null) {
                PrintRequestLogFilter.LOGGER.info("request body:\t" + reqBbody);
            }

            // 打印response
            InputStream out = ctx.getResponseDataStream();
            String outBody = StreamUtils.copyToString(out, Charset.forName("UTF-8"));
            if (outBody != null) {
                PrintRequestLogFilter.LOGGER.info("response body:\t" + outBody);
            }

            ctx.setResponseBody(outBody);//重要!!!

        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    String printArray(String[] arr) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i]);
            if (i < arr.length - 1) {
                sb.append(",");
            }
        }
        return sb.toString();
    }
}
 
        

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM