>  기사  >  Java  >  봄구름이란? Spring Cloud 사용 소개

봄구름이란? Spring Cloud 사용 소개

不言
不言원래의
2018-09-20 15:18:218441검색

이 기사에서는 봄구름이 무엇인지 알려드립니다. Spring Cloud 사용에 대한 소개에는 특정 참고 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. 스프링클라우드란?

Spring은 개발자가 분산 시스템에서 공통 구성 요소(예: 구성 관리, 서비스 검색, 회로 차단기, 지능형 라우팅, 마이크로 에이전트, 제어 버스, 일회성 토큰, 글로벌 잠금)를 신속하게 구축하는 데 도움이 되는 일련의 도구를 제공합니다. , 마스터 노드 선택, 분산 세션, 클러스터 상태). 분산 환경에서 다양한 시스템을 조정하고 다양한 서비스에 대한 템플릿 구성을 제공합니다. Spring Cloud를 사용하면 개발자는 이러한 템플릿을 구현하고 랩톱에서 데이터 센터 및 클라우드 플랫폼에 이르기까지 모든 분산 환경에서 잘 작동하는 애플리케이션을 구축할 수 있습니다.

Spring Cloud는 Spring Boot를 기반으로 하며 Spring Boot로 생성된 다양한 마이크로서비스 애플리케이션을 관리하는 데 가장 적합합니다. 분산 환경에서 각 Spring Boot 마이크로서비스를 관리하려면 서비스 등록 문제가 있어야 합니다. 그럼 서비스 등록부터 시작하겠습니다. 등록이기 때문에 등록 센터를 관리하는 서버가 있어야 합니다. Spring Cloud 관리 하에 있는 각 Spring Boot 애플리케이션은 등록이 필요한 클라이언트입니다.

Spring Cloud는 erureka 서버를 사용하며, 구성 파일에 액세스해야 하는 모든 애플리케이션이 erureka 클라이언트로 등록됩니다. Eureka는 고가용성 구성 요소이며, 각 인스턴스가 등록된 후 등록 센터에 하트비트를 보내야 하며, 기본적으로 erureka 서버도 지정해야 합니다. .

1. 유레카 서버 생성

먼저 스프링 부트 프로젝트를 생성합니다

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>me.cn</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>test</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.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>10</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <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-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </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>
        </dependencies>
    </dependencyManagement>

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

</project>

스프링 부트 프로젝트

@EnableEurekaServer
@SpringBootApplication
public class TestApplication {

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

eureka 서버의 구성 파일 애플리케이션의 시작 클래스에 @EnableEurekaServer 주석을 추가해야 합니다. yml

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

유레카 서버를 시작한 다음 http://localhost:8761을 방문하세요. 인터페이스는 다음과 같습니다. "사용 가능한 인스턴스 없음"은 클라이언트 등록이 없음을 의미합니다

2. 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.chry</groupId>
    <artifactId>test1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>test1</name>
    <packaging>jar</packaging>
    <description>Demo Spring Boot Client</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.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>

@EnableEurekaClient 주석을 사용하여 클라이언트

@SpringBootApplication
@EnableEurekaClient
@RestController
public class Test1Application {

    public static void main(String[] args) {
        SpringApplication.run(Test1Application.class, args);
    }
    @Value("${server.port}")
     String port;
     @RequestMapping("/")
     public String home() {
                 return "hello world from port " + port;    }

}

yml 파일

eureka:
     client:
         serviceUrl:
             defaultZone: http://localhost:8761/eureka/
server:
     port: 8762
spring:
     application:
         name: service-helloworld

의 구성임을 나타냅니다. 마지막으로 클라이언트를 시작하면 서버 포트

두 번째로 클라이언트가 성공적으로 등록된 것을 볼 수 있습니다. 구성 관리

Spring Cloud의 솔루션은 이러한 구성을 구성하는 것입니다. 파일은 버전 관리 서버에 배치되며 Spring Cloud의 기본 구성은 GIT를 사용합니다. 모든 웹 서비스는 GIT에서 이러한 구성 파일을 가져옵니다. GIT 서버와 특정 웹 서버 간에 공유 스토리지가 필요하지 않으므로 네트워크에 연결할 수 있는 한 웹 서비스는 구성 정보의 저장 위치에서 분리될 수 있습니다.

2.1 새로운 종속성을 가진 구성 서버

pom 파일 만들기

<dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-config-server</artifactId>
         </dependency>

@EnableConfigServer 주석은 구성 서버를 설명합니다. 마찬가지로 @EnableEurekaClient를 사용하여 서비스 센터에 등록합니다.

구성 서버 구성 파일 application.yml, 구성 파일의 URL은 GIT 서버의 웨어하우스 주소이고, searchPaths는 웨어하우스에서 구성 파일이 있는 폴더의 경로이므로 지정할 필요가 없습니다. 특정 구성 파일 이름은 애플리케이션(즉, 클라이언트)에 의해 결정되기 때문에 서버 측의 특정 구성 파일 이름입니다.

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8888

spring:
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/ning9/CRUD.git
          searchPaths: spring-cloud/helloworldConfig
  application:
    name: config-server

구성 서버를 시작하고 http://localhost:8888/config-client-dev.properties를 방문하여 구성 파일 콘텐츠를 표시합니다.

2.2 config client

시작 파일

 @SpringBootApplication
 @RestController
 public class ConfigClientApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ConfigClientApplication.class, args);
     }
 
     @Value("${hello}")
     String hello;
     @RequestMapping(value = "/hello")
     public String hello(){
         return hello;
     }
 }

yml 파일

spring:
    application:
      name: config-client
    cloud:
      config:
        label: master
        profile: dev
        uri: http://localhost:8888/
  server:
   port: 8881

생성 Start config-client를 적용한 후 http://locahost/8881/hello에 접속하면 애플리케이션 자체가 hello의 특정 내용을 직접 구성하지도 않고 특정 구성 파일을 지정하지도 않는 것을 볼 수 있습니다. Spring Cloud 프레임워크에 의해 제출됩니다.

3. 자동 새로 고침 구성

먼저 pom.xml에 다음 종속성을 추가합니다. spring-boot-starter-actuator/refresh 함수를 포함하여 프로그램의 실행 상태를 모니터링할 수 있는 모니터링 함수 집합입니다. spring-boot-starter-actuator是一套监控的功能,可以监控程序在运行时状态,其中就包括/refresh的功能。

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

其次,开启refresh机制, 需要给加载变量的类上面加载@RefreshScope注解,其它代码可不做任何改变,那么在客户端执行/refresh

@SpringBootApplication
@RestController
@RefreshScope
public class ConfigClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }

    @Value("${hello}")
    String hello;
    @RequestMapping(value = "/hello")
    public String hello(){
        return hello;
    }
}

두 번째로, 새로 고침 메커니즘을 활성화하려면 변수를 로드하는 클래스에 @RefreshScope 주석을 로드해야 합니다. 다른 코드는 변경하지 않고 그대로 두고 /refresh를 실행할 수 있습니다. code> 클라이언트에서 이 클래스 아래의 변수 값은 구성 클라이언트를 통해 GIT에서 얻은 구성을 포함하여 언제든지 업데이트됩니다. <p><pre class="brush:js;toolbar:false;">eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/spring: application: name: config-client cloud: config: label: master profile: dev discovery: enabled: true service-id: config-server management: security: enabled: falseserver: port: 8881</pre></p>하지만 이 방법을 사용하려면 업데이트된 데이터를 보려면 수동으로 메서드를 다시 실행해야 합니다<p><span style="font-size: 14pt"><strong></strong> 4. 분산 환경에서 구성 서비스를 자동으로 검색합니다.</span></p> <p><strong></strong>구성 서버를 서비스 센터에 등록</p> <p> <strong></strong>Hello World 애플리케이션을 유레카 서비스 센터에 등록합니다. 구성 방법은 이전과 동일합니다.</p> <p></p>구성 파일을 수정하고 config-server의 URL 하드 코딩 메커니즘을 이름 기반 자동 검색 메커니즘으로 변경합니다. 서비스센터🎜<pre class="brush:js;toolbar:false;">eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/spring: application: name: config-client cloud: config: label: master profile: dev discovery: enabled: true service-id: config-server management: security: enabled: falseserver: port: 8881</pre><p>我们注释掉了硬编码的config-server的URL配置, 取而代之的是服务注册中心的地址http://localhost:8761/eureka/以及配置服务的名字“config-server”, 同时打开自动发现机制discovery.enable = true. 我们在运行一下hello world应用, 可以发现, GIT里面的内容依然可以访问。此时我们的hello world应用已经完全不知道配置服务的地址,也不知道配置的内容, 所有这些都通过服务注册中心自动发现。</p> <p><span style="font-size: 14pt"><strong>五、客户端的负载均衡</strong></span></p> <p>Spring Cloud用Ribbon来实现两个Hello World服务的负载均衡</p> <p>5.1创建ribbon服务</p> <p>添加pom依赖</p><pre class="brush:js;toolbar:false;">&lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt; &lt;artifactId&gt;spring-cloud-starter-ribbon&lt;/artifactId&gt; &lt;/dependency&gt;</pre><p><strong>创建启动类<span class="hljs-title">ServiceRibbonApplication</span></strong></p><pre class="brush:js;toolbar:false;">@SpringBootApplication @EnableDiscoveryClient public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }</pre><p>@EnableDiscoveryClient向服务中心注册,并且注册了一个叫restTemplate的bean。</p> <p>@ LoadBalanced注册表明,这个restRemplate是需要做负载均衡的。</p> <p><strong>创建获取一个获取Hello内容的service类</strong></p><pre class="brush:js;toolbar:false;"> @Service public class HelloService { @Autowired RestTemplate restTemplate; public String getHelloContent() { return restTemplate.getForObject(&quot;http://SERVICE-HELLOWORLD/&quot;,String.class); } }</pre><p>这里关键代码就是, restTemplate.getForObject方法会通过ribbon负载均衡机制, 自动选择一个Hello word服务,</p> <p>这里的URL是“http://SERVICE-HELLOWORLD/",其中的SERVICE-HELLOWORLD是Hello world服务的名字,而注册到服务中心的有两个SERVICE-HELLOWORLD。 所以,这个调用本质是ribbon-service作为客户端根据负载均衡算法自主选择了一个作为服务端的SERVICE-HELLOWORLD服务。然后再访问选中的SERVICE-HELLOWORLD来执行真正的Hello world调用。</p> <p><span style="font-size: 14pt"><strong>六、用声明式REST客户端Feign调用远端http服务</strong></span></p> <p>添加新的依赖</p><pre class="brush:js;toolbar:false;">&lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt; &lt;artifactId&gt;spring-cloud-starter-feign&lt;/artifactId&gt; &lt;/dependency&gt;</pre><p><strong>创建启动类,需要加上@EnableFeignClients注解以使用Feign, 使用@EnableDiscoveryClient开启服务自动发现</strong></p> <p><strong>添加配置文件application.yml, 使用端口8902, 名字定义为service-feign, 并注册到eureka服务中心</strong></p> <p><strong>定义Feign:一个用@FeignClient注解的接口类</strong></p> <p><code>@FeignClient用于通知Feign组件对该接口进行代理(不需要编写接口实现),使用者可直接通过@Autowired注入; 该接口通过value定义了需要调用的SERVICE-HELLOWORLD服务(通过服务中心自动发现机制会定位具体URL); @RequestMapping定义了Feign需要访问的SERVICE-HELLOWORLD服务的URL(本例中为根“/”)

@FeignClient(value = "SERVICE-HELLOWORLD")  
public interface HelloWorldService {
      @RequestMapping(value = "/",method = RequestMethod.GET)
     String sayHello();
 }

Spring Cloud应用在启动时,Feign会扫描标有@FeignClient注解的接口,生成代理,并注册到Spring容器中。生成代理时Feign会为每个接口方法创建一个RequetTemplate对象,该对象封装了HTTP请求需要的全部信息,请求参数名、请求方法等信息都是在这个过程中确定的,Feign的模板化就体现在这里

编写一个Controller。

注入之前通过@FeignClient定义生成的bean, 

sayHello()映射到http://localhost:8902/hello, 在这里,我修改了Hello World服务的映射,将根“/”, 修改成了“/hello”。

@RestController
  public class WebController {
     @Autowired HelloWorldService helloWorldFeignService;
     @RequestMapping(value = "/hello",method = RequestMethod.GET)
     public String sayHello(){
         return helloWorldFeignService.sayHello();
     }
 }

七、断路器

7.1在Ribbon应用中使用断路器

先添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

在Spring Boot启动类上添加@EnableCircuitBreaker注解

用@HystrixCommand注解标注访问服务的方法

@Service
  public class HelloService {
      @Autowired RestTemplate restTemplate;
  
      @HystrixCommand(fallbackMethod = "serviceFailure")
      public String getHelloContent() {
          return restTemplate.getForObject("http://SERVICE-HELLOWORLD/",String.class);
      }
  
     public String serviceFailure() {
         return "hello world service is not available !";
     }
 }

@HystrixCommand注解定义了一个断路器,它封装了getHelloContant()方法, 当它访问的SERVICE-HELLOWORLD失败达到阀值后,将不会再调用SERVICE-HELLOWORLD, 取而代之的是返回由fallbackMethod定义的方法serviceFailure()。@HystrixCommand注解定义的fallbackMethod方法,需要特别注意的有两点:

第一,  fallbackMethod的返回值和参数类型需要和被@HystrixCommand注解的方法完全一致。否则会在运行时抛出异常。比如本例中,serviceFailure()的返回值和getHelloContant()方法的返回值都是String。

第二,  当底层服务失败后,fallbackMethod替换的不是整个被@HystrixCommand注解的方法(本例中的getHelloContant), 替换的只是通过restTemplate去访问的具体服务。可以从中的system输出看到, 即使失败,控制台输出里面依然会有“call SERVICE-HELLOWORLD”。

7.2在Feign应用中使用断路器

 用@FeignClient注解添加fallback类, 该类必须实现@FeignClient修饰的接口。

@FeignClient(name = "SERVICE-HELLOWORLD", fallback = HelloWorldServiceFailure.class) 
public interface HelloWorldService {
     @RequestMapping(value = "/", method = RequestMethod.GET)    
      public String sayHello();
 }

创建HelloWorldServiceFailure类, 必须实现被@FeignClient修饰的HelloWorldService接口。注意添加@Component或者@Service注解,在Spring容器中生成一个Bean

@Component
 public class HelloWorldServiceFailure implements HelloWorldService {
     @Override
     public String sayHello() {
         System.out.println("hello world service is not available !");
         return "hello world service is not available !";
     }
 }

在application.yml中添加如下配置:

feign:
   hystrix:
     enabled: true

八、路由网管zuul

创建新的工程添加新的依赖

b4b38e33757a6497aa8690936b905cc1
     05a8acc5c31084a4f61ade01873802caorg.springframework.cloud192ca2f7b8c770b01c8f81e6bdd5b947
    9bc4cbb67f66e148869423c0d27e5f90spring-cloud-starter-zuulb68fb17cb904a46b73e6272850323873
09a0e22e5aaafd848ae04665be625b91

 创建启动类: 使用@EnableZuulProxy注解

@EnableZuulProxy
  @EnableEurekaClient
 @SpringBootApplication
 public class ServiceZuulApplication {
     public static void main(String[] args) {
         SpringApplication.run(ServiceZuulApplication.class, args);
     }
 }

编写zuul服务配置:

简单配置两个路由, 一个路由到ribbon,一个路由到feign; 由于都注册到eureka服务中心,所以都用通过serviceId来发现服务具体地址, path是路由的地址映射关系

eureka:
      client:
          serviceUrl:
              defaultZone: http://localhost:8761/eureka/
  server:
      port: 8904
  spring:
      application:
          name: service-zuul
 zuul:
   routes:
     ribbo:
       path: /api-ribbon/**
       serviceId: service-ribbon
     feign:
       path: /api-feign/**
       serviceId: service-feign

这时启动zuul服务, 然后访问http://localhost:8904/api-ribbon可直接路由到http://localhost:8901/.  

http://localhost:8904/api-feign/hello可路由到http://localhost:8902/hello

zuul还提供了过滤功能, 只要实现接口ZuulFilter即可对请求先进行筛选和过滤之后再路由到具体服务。

위 내용은 봄구름이란? Spring Cloud 사용 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.