Spring Cloud Combat Series (2) — клиентский вызов + лента

Spring Cloud

Связанный

  1. Spring Cloud Combat Series (1) — регистрация и обнаружение сервисов Eureka

  2. Spring Cloud Combat Series (2) — клиентский вызов + лента

  3. Spring Cloud Combat Series (3) — Декларативное притворство клиента

  4. Боевая серия Spring Cloud (4) - Fuse Hystrix

  5. Spring Cloud Combat Series (5) — Service Gateway Zuul

  6. Spring Cloud Combat Series (6) — Распределенный центр конфигурации Spring Cloud Config

  7. Spring Cloud Combat Series (7) — отслеживание служебных ссылок Spring Cloud Sleuth

  8. Spring Cloud Combat Series (8) — Мониторинг микросервисов Spring Boot Admin

  9. Spring Cloud Combat Series (9) — Аутентификация и авторизация службы Spring Cloud OAuth 2.0

  10. Практическая серия Spring Cloud (10) — Единый вход JWT и Spring Security OAuth

предисловие

В предыдущей статье мы представилиEureka Реестр услуг, в этой статье описывается, как использоватьEureka Реестр услуг, чтобы построить простойСервис регистрации серверов,Зависит отклиентпройти черезRibbon Балансировка нагрузкипозвонить в сервисный центр.

текст

1. Создайте поставщика услуг

Создаватьservice-hiизModule, после создания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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>io.ostenant.github.springcloud</groupId>
    <artifactId>service-hi</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service-hi</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-cloud-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>${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>

пройти черезаннотация @EnableEurekaClientпоказать себя одинEureka Client.

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

Создать контроллерHelloController, обеспечить внешний/hiизHTTPоказание услуг. Возвращает текущий в ответных данныхЭкземпляр службыизНомер порта.

@RestController
public class HelloController {

    @Value("${server.port}")
    private String port;

    @RequestMapping("/hi")
    public String hi(@RequestParam String name) {
        return "Hi " + name + ", I am from port: "  + port;
    }
}

существуетконфигурационный файлотмечено вРеестр услугадрес,application.ymlФайл конфигурации выглядит следующим образом:

spring:
  active:
    profiles: service-hi1 # service-hi2

---

spring:
  profiles: service-hi1
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8763
spring:
  application:
    name: service-hi

---

spring:
  profiles: service-hi2
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8764
spring:
  application:
    name: service-hi

соответственно сspring.profiles.active=hi1а такжеspring.profiles.active=hi2так какSpring Bootизпараметры команды запуска,существуетНомер порта 8763а также8764запускать2индивидуальныйпоставщики услугпример.

2. Создайте потребителя услуги

воссоздатьservice-ribbonизModule, в егоpom.xmlимпорт файловЗависит от запуска spring-cloud-starter-eureka,spring-cloud-starter-ribbon,spring-boot-starter-web, код показан ниже:

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>io.ostenant.github.springcloud</groupId>
    <artifactId>service-ribbon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service-ribbon</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.SR1</spring-cloud.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>${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>

в проектеконфигурационный файлназначенная службаРеестр услугадрес,Имя приложениядляservice-ribbon,Номер портадля8762. полный профильapplication.ymlследующим образом:

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

в приложениистартовый классна, через@EnableDiscoveryClientКСервисный центрЗарегистрируйте свою информацию, чтобыSpring BootКонтейнер регистрируетRestTemplateобъект и через@LoadBalancedВ аннотации указано, что этоRestRemplateвключиБалансировка клиентской нагрузкифункция.

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

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

Напишитестовый интерфейс, введите вышеуказанноеRestTemplateобъект для потребленияservice-hiУслуги/hiинтерфейс. существуетRestTemplateизURL, мы уточнимсервис-продюсеризимя хостаа такжеНомер портазаменить его нанаименование услуги.

@RestController
public class HelloController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/hi")
    public String requestForHi(@RequestParam String name){
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }
}

Несколько посещений в браузереhttp://localhost:8762/hi?name=ribbon, браузер поочередно отображает:

Hi ribbon, I am from port: 8763

Hi ribbon, I am from port: 8764

В конкретном вызывающем процессеRibbonкоторый предоставил@LoadBalancedПримечаниеEureka Serverзапрос наперечень услуг,согласно снаименование услугиоказатьсяSERVICE-HIизЭкземпляр службы. Если есть несколькоSERVICE-HIпример,Ribbonбудет основываться наБалансировка клиентской нагрузкиАлгоритм выбирает один из них и ставитURLсерединаSERVICE-HIзаменяется конкретным экземпляромимя хостаа такжеНомер порта.

Ссылаться на

  • Фан Чжипэн «Глубокое понимание Spring Cloud и построения микросервисов»

Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack

零壹技术栈

Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.