整合ribbon

77 阅读3分钟

1,在服务消费者的项目中引入依赖

            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

主程序:


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @ClassName: EurekaApp
 * @Description:
 * @author: liYue
 * @date: 2021/6/15  16:37
 */
//启动之后,访问http://localhost:7001/
@EnableEurekaServer   //服务端的启动类,可以接受别人注册进来
@SpringBootApplication
public class EurekaApp {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApp.class,args);
    }
}

2,配置类:


import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @ClassName: ConfigBean
 * @Description:
 * @author: liYue
 * @date: 2021/6/15  10:08
 */
@Configuration
public class ConfigBean {
    //    配置负载均衡实现RestTemplate
    @LoadBalanced   //ribbon
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

3,写一个controller测试

public class DeptConsumerCont {
    //消费者不应该有service
    //RestTemplate   可以直接调用   先注册 到容器中
    @Autowired
    private RestTemplate restTemplate;  //提供多种便捷访问远程HTTP服务的方法,简单的restful服务模板

//    ribbon.  我们这里的地址,应该是一个变量,通过服务名来访问
//    private  static  final String REST_URL_PREFIX="http://localhost:8001";
   private  static  final String REST_URL_PREFIX="http://SPRING-CLOUD-PROVIDER-DEPT-8001";



//    @RequestMapping("/consumer/dept/get/{id}")
//    public Dept get(@PathVariable long id){
//
//        return restTemplate.getForObject(REST_URL_PREFIX+"/test2/"+id, Dept.class);
//
//    }
    @RequestMapping("/getList")
    @ResponseBody
    public List<Dept> getList(){
        //这里要把服务提供者的项目也启动,不然会报500
        Dept[] forObject = restTemplate.getForObject(REST_URL_PREFIX + "/test", Dept[].class);

        return Arrays.asList(forObject);

    }
}

4,然后再yml配置eureka中配置注册中心的地址

  port: 80

eureka:
  client:
    register-with-eureka: false  #不向eureka服务注册自己
    service-url:
      defaultZone: http://localhost:7001/eureka/

5,eureka服务注册中心的项目中的配置

  • 依赖
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
  • yml
  port: 7001

#Eureka
eureka:
  instance:
    hostname: localhost #Eureka服务端实例名称
  client:
# register-with-eureka: false #表示是否eureka注册中心注册自己
    fetch-registry: false #如果为false则表示自己为注册中心
    service-url: #监控页面
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • 主程序

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @ClassName: EurekaApp
 * @Description:
 * @author: liYue
 * @date: 2021/6/15  16:37
 */
//启动之后,访问http://localhost:7001/
@EnableEurekaServer   //服务端的启动类,可以接受别人注册进来
@SpringBootApplication
public class EurekaApp {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApp.class,args);
    }
}


6,随便写几个服务提供者的项目,为了模拟效果,大部分配置都是一样,每个服务连接的数据库都是不一样的

  • 依赖

<!--完善监控信息-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--加入eureka依赖-->
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>





        <!--我们需要拿到实体类,所以要配置api module-->
        <dependency>
            <groupId>com.ly</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--jetty-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <!--热部署工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>

  • cont

写两个接口供服务消费者远程调用---通过服务名调用,因为整合了ribbon的原因


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ly.pojo.Dept;
import com.ly.springcloud.dao.DaoDept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * @ClassName: DeptCont
 * @Description:
 * @author: liYue
 * @date: 2021/6/14  23:15
 */
@Controller
public class DeptCont {
    @Autowired
    private DaoDept daoDept;

    @ResponseBody
    @GetMapping("/test")
    public List<Dept> text(){



        return daoDept.selectList(null);
    }
    @ResponseBody
    @GetMapping("/test2/{id}")
    public Dept text2(@PathVariable int id){



        return daoDept.selectById(id);
    }
}
  • dao

简化操作用的mybatis-plus


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ly.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;

/**
 * @ClassName: DaoDept
 * @Description:
 * @author: liYue
 * @date: 2021/6/14  23:17
 */
@Mapper
public interface DaoDept extends BaseMapper<Dept> {
}

  • 主程序

主要是@EnableEurekaClient这个注解


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @ClassName: App
 * @Description:
 * @author: liYue
 * @date: 2021/6/14  23:20
 */
@EnableEurekaClient //在服务启动后自动注册到Eureka中
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}

  • yml

因为多个服务提供者项目,所以每个项目的数据库是不一样的

除了url(spring.datasource.url),name(application.name)。其他 都可copy

  port: 8001


mybatis:
  type-aliases-package: com.ly.pojo
  config-location: classpath:mybatis/mybatis-controller.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

~~~~

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
    username: root
    password: 1234
  application:
    name: spring-cloud-provider-dept-8001


#Eureka的配置,服务注册到哪里
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/

  instance:
    instance-id: springcloud-provider-dept8001   #修改eureka中的默认描述信息


总结:引入依赖,配置类和yml,核心注解@EnableEurekaClient,@EnableEurekaServer 一个是注册中心的一个是注册服务的,3个服务提供者如果服务名一样,那么ribbon提供的负载均衡的方式是默认是轮询