美文网首页
4 SpringCloud中服务消费者Ribbon

4 SpringCloud中服务消费者Ribbon

作者: lijiaccy | 来源:发表于2018-01-26 11:51 被阅读0次

    上面的Eurefa高可用依葫芦画瓢就弄,不是太明白怎么回事。但是有一点但是怎么去用呢,也就是怎么用负载均衡去调用。


    注册中心server
    添加依赖

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

    配置文件

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

    上面的eureka.client.registerWithEureka= false表示为注册中心,自己不向自己注册
    eureka.client.fetchRegistry: false表示注册中心的职责就是维护服务实例,并不需要去检索服务。

    启动类

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @EnableEurekaServer
    @SpringBootApplication
    public class AppServer {
        public static void main(String[] args) {
            SpringApplication.run(AppServer.class, args);
        }
    }
    

    完成了注册中心server。
    服务提供者client
    依赖在service的pom文件中将

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    

    替换 替换 替换 替换 替换 替换

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

    配置文件

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

    启动类

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @EnableEurekaClient
    @RestController
    public class AppClient2 {
    
        public static void main(String[] args) {
            SpringApplication.run(AppClient2.class, args);
        }
    
        @Value("${server.port}")
        String port;
        @RequestMapping("/hi")
        public String home(@RequestParam String name) {
            return "hi "+name+",i am from port:" +port;
        }
    
    }
    

    client2和client一模一样,就是配置文件中server.port=8763

    然后依次启动server,client,client2。
    访问 http://localhost:8761/ 进入eurefa控制台,看到两个服务

    Ribbon
    依赖jar包在client的pom文件基础上加上

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

    然后配置文件

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

    Controller

    @RestController
    public class HelloControler {
        @Autowired
        HelloService helloService;
    
        @RequestMapping(value = "/hi")
        public String hi(@RequestParam String name){
            return helloService.hiService(name);
        }
    }
    

    server

    @Service
    public class HelloService {
    
        @Autowired
        RestTemplate restTemplate;
    
        public String hiService(String name) {
            //通过启动类注入ioc容器的restTemplate来消费service-hi服务的“/hi”接口
            //在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名
            return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
        }
    }
    

    启动类

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class AppRibbon {
    
        public static void main(String[] args) {
            SpringApplication.run(AppRibbon.class, args);
        }
    
        //启动时自动注入ioc
        @Bean
        @LoadBalanced
        RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    

    然后启动这个ribbon。在eruefa控制台也会多一个服务。


    然后不断刷新 http://localhost:8764/hi?name=lijia 来查看负载均衡
    在浏览器中 出现两个不同的端口号8762和8763,这里面负载均衡已经完成。
    此时的架构图

    • 一个服务注册中心,eureka server,端口为8761
    • service-hi工程跑了两个实例,端口分别为8762,8763,分别向服务注册中心注册
    • sercvice-ribbon端口为8764,向服务注册中心注册
    • 当sercvice-ribbon通过restTemplate调用service-hi的hi接口时,因为用ribbon进行了负载均衡,会轮流的调用service-hi:8762和8763 两个端口的hi接口;

    代码放在 https://github.com/lijiaccy/springcloud-study/tree/master/eurefa-Ribbon

    参考:http://blog.csdn.net/forezp/article/details/70148833

    相关文章

      网友评论

          本文标题:4 SpringCloud中服务消费者Ribbon

          本文链接:https://www.haomeiwen.com/subject/ufjvaxtx.html