Producer & Consumer

需要与Eureka结合使用

Eureka环境搭建

Producer

一、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>peter.test</groupId>
    <artifactId>producer1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>producer1</name>
    <description>Demo project for Spring Eureka Producer</description>

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

    <dependencies>
        <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-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>

    </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>
View Code

二、application.yml文件

---
spring:
  application:
    name: spring-cloud-producer
  profiles: producer1
server:
  port: 9010
eureka:
  instance:
    hostname: peterhost1
    #ip-address: 127.0.0.1
    #prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://peterhost1:9000/eureka/
View Code

三、启动注解与Rest Controller

@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan({"peter.test.producer1","Service"})
public class Producer1Application {

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

@RestController
class TestController{

    @RequestMapping("/test")
    public String index(){
        return "peter host.";
    }

    @RequestMapping("/test2")
    public String index(@RequestParam String name) {
        return "hello "+name+",this is first messge";
    }

}
View Code

Consumer

一、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>peter.test</groupId>
    <artifactId>consumer1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

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

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

    <dependencies>
        <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-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</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>

        <!--
        Monitor
        -->

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix-dashboard -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

        <!--
        turbine
        -->
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-netflix-turbine -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-turbine</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-turbine -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
        </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>
View Code

二、application.yml文件

---
spring:
  application:
    name: spring-cloud-consumer1
  profiles: consumer1
server:
  port: 9021
feign:
  hystrix:
    enabled:true
eureka:
  instance:
    hostname: peterhost1
  client:
    service-url:
      defaultZone: http://peterhost1:9000/eureka/
View Code

三、FeignClient请求Producer

@FeignClient(name= "spring-cloud-producer",fallback =Producer1ServiceHelloHystrix.class)
@Component
public interface Producer1Service {

    @RequestMapping(value = "/hello")
    public String hello(@RequestParam(value = "name") String name);


}
View Code

name="spring-cloud-producer" 指明producer在Eureka中注册的服务名称

四、Hystrix断路器实现

@Component
public class Producer1ServiceHelloHystrix implements  Producer1Service{

    @Override
    public String hello(String name) {
        return "hello" +name+", this messge from hystrix. ";
    }
}
View Code

五、Consumer对外提供的Controller

@RestController
public class ConsumerController {

    @Autowired
    Producer1Service producer1Service;

    @RequestMapping("/hello/{name}")
    public String index(@PathVariable("name") String name) {
        System.out.println("log begin\r\n");
        String remoteResult="Air";
        System.out.println(producer1Service.toString());

        try
        {
            if(producer1Service==null)   {
                remoteResult="Null remote service.";

                System.out.println("Null remote service.\r\n");
            }
            else
                remoteResult=producer1Service.hello(name);
        }
        catch (Exception ex){
            remoteResult+="\r\n"+ex.getMessage()+ex.getCause()+ex.getStackTrace().toString();
        }

        return remoteResult;
    }

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/service-instances/{applicationName}")
    public List<ServiceInstance> serviceInstancesByApplicationName(
            @PathVariable String applicationName) {
        return this.discoveryClient.getInstances(applicationName);
    }

}
View Code

六、运行

负载均衡

新建一个Producer的项目,为了区分把Controller中返回的信息做一些调整即可

一、application.yml文件

---
spring:
  application:
    name: spring-cloud-producer
  profiles: producer2
server:
  port: 9011
eureka:
  instance:
    hostname: peterhost2
    #ip-address: 127.0.0.1
    #prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://peterhost2:9001/eureka/
View Code

spring.application.name要和前面一个producer的一样,此处是spring-cloud-producer

二、运行

新的Producer注册至Eureka会有一定的延迟

猜你喜欢

转载自www.cnblogs.com/dopeter/p/9404796.html