springcloud 从零开始第四天

上一篇已经将了如何将生产者注册到eureka中,本篇文章讲的是如何通过eureka去消费生产者

model的创建前三篇的操作 已经很熟悉了所以 就调过创建model的过程,直接到项目内部的编写

项目结构图:

 

首先要把pom中的依赖添加进去

<dependencies>
    <!--调用公用实体类,相当于依赖这个api-->
    <dependency>
        <groupId>com.wangsc.springcloud</groupId>
        <artifactId>microservicecloud-api</artifactId>
        <version>${project.version}</version>
    </dependency>

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

    <!-- 修改后立即生效,热部署 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>springloaded</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>

    <!-- robbin 配置-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <!--上面的eureka pom里已经添加robbin的依赖了,所以这块可以不用-->
    <!--<dependency>-->
        <!--<groupId>org.springframework.cloud</groupId>-->
        <!--<artifactId>srping-cloud-starter-robbin</artifactId>-->
    <!--</dependency>-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

</dependencies>

yml的配置文件主需要把当前服务注册到eureka中即可, 如果需要数据库配置自行添加即可

#服务端口号
server:
  port: 1025
#服务注册到eureka中
eureka:
  client:
    register-with-eureka: false #是否将自己注册客户端到eureka上
    service-url:
      defaultZone: http://eureka7001.com:7001/euerka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka

 

eureka整合ribbon只需要在client端进行ribbon的配置即可,默认的策略是轮询机制,如果需要可以自行配置负载均衡的策略。

**此负载均衡只是针对客户端,切记。

启动类需要添加上相关的robbin注解

microservicecloud-dept是生产的微服务名称切莫填写错误,后面的配置就是你自定义的配置规则,如果不写就是默认轮询方式

配置bean

本次写的不是用feign模式调用微服务。

/**
 * @author:wang
 * @Description:
 * @date:2018/11/7
 */
@Configuration
public class ConfigBean {

    @Bean
    @LoadBalanced() //Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端       负载均衡的工具。
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    /**loadbalance
     * 默认是负载均衡机制是轮询。
     * 如果想切换其他的官方提供给的方法可以配置一下
     * 注释去掉这样就切换到随机模式*/
//    @Bean
//    public IRule myRule(){
//        return new RandomRule();
//    }

}

 

自定义负载均衡的策略,需要继承AbstractLoadBalancerRule实现里面的choose方法,就是负载均衡的策略

/**
 * @author:wang
 * @Description:
 * @date:2018/11/23
 */

public class UserFiveRules extends AbstractLoadBalancerRule {

    /**
     *  负载均衡算法,每台服务器,调动五次后,调用下一台
     * @param lb
     * @param key
     * @return
     */
    /**每台机器调用的次数*/
    private Integer totle = 0;
    /** 每台机器的索引,目前分3台*/
    private Integer service_index = 0 ;

    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        }
        Server server = null;

        while (server == null) {
            if (Thread.interrupted()) {
                return null;
            }
            List<Server> upList = lb.getReachableServers();
            List<Server> allList = lb.getAllServers();

            int serverCount = allList.size();
            if (serverCount == 0) {
                /*
                 * No servers. End regardless of pass, because subsequent passes
                 * only get more restrictive.
                 */
                return null;
            }
            if (totle < 4) {
                ++totle;
            } else {
                totle=0;
                service_index++;
            }
            Integer index = (service_index % 3);
            server = upList.get(index);

            if (server == null) {
                /*
                 * The only time this should happen is if the server list were
                 * somehow trimmed. This is a transient condition. Retry after
                 * yielding.
                 */
                Thread.yield();
                continue;
            }

            if (server.isAlive()) {
                return (server);
            }

            // Shouldn't actually happen.. but must be transient or a bug.
            server = null;
            Thread.yield();
        }

        return server;

    }



    @Override
    public Server choose(Object key) {
        return choose(getLoadBalancer(), key);
    }

    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {
        // TODO Auto-generated method stub

    }
}

 

controller模仿调用

/**
 * @author:wang
 * @Description:
 * @date:2018/11/7
 */
@RestController
public class DeptController_Consumer {

    @Autowired
    private RestTemplate restTemplate;

    /**服务提供端 */
    private static final String REST_URL_PREFIX = "http://microservicecloud-dept";
//    private static final String REST_URL_PREFIX = "http://localhost:8001";

    @RequestMapping(value = "/consumer/add")
    public Boolean add(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, Boolean.class);
    }

    @RequestMapping(value = "/consumer/get/{id}")
    public Dept get(@PathVariable("id") Long id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
    }

    @RequestMapping(value = "/consumer/list")
    public List<Dept> list(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
    }

}

由于这段项目是很早以前写的,今天才仅需更新,可能有一些遗漏望请见谅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值