cloud负载均衡策略主要是rest+ribbon和Feign,但是Feign已经集成了ribbon,所以比较牛逼。就用这个好了

1、首先搭建那么几个项目,一个eureka服务端,用于注册服务,再来三个客户端用于注册服务(一个生产者,两个消费者)。

feign配置负载均衡 配置文件 feign负载均衡策略_feign

生产者的接口可以让消费者去消费。。。前提是必须注册到服务上

2、首先看eureka服务端配置

    导入依赖(有的依赖可能不是必须的,我懒得检查,直接全部复制):

<dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <version>2.0.0.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
                <version>1.4.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>1.4.4.RELEASE</version>
            </dependency>
            <dependency>
		        <groupId>org.springframework.boot</groupId>
		        <artifactId>spring-boot-starter-security</artifactId>
		    </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.BUILD-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

application.yml配置信息:

server:
  port: 8888
  
spring:
  security: 
    basic: 
        enable: true
    user: 
        name: admin
        password: 1234  

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    service-url: 
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/

启动类:

@SpringBootApplication //spring-boot 启动注解
@EnableEurekaServer // spring-cloud 服务注解
public class RegisterMain{
     public static void main(String [] args) {
    	 new SpringApplicationBuilder(RegisterMain.class).web(true).run(args);
     }
}

写一个配置类

//Spring Cloud 2.0 以上的security默认启用了csrf检验,要在eurekaServer端配置security的csrf检验为false
//覆盖父类的 configure(HttpSecurity http) 方法,关闭掉 csrf。
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
	 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        super.configure(http);
    }
}

-----------------------------------------------这样就完成了服务端的配置--------------------------------------------------------

 

 

3、创建一个客户端。这里项目创建一个boot工程就行了,然后启动两次

首先是依赖,和上面一样,复制就行了,至于没用的依赖不管了。

启动类:

@SpringBootApplication
@EnableEurekaClient //Eureka Client111
public class AppMain {
    public static void main(String[] args) {
        new SpringApplicationBuilder(AppMain.class).web(true).run(args);
    }
}

application.yml配置信息:

server:
  port: 8001
 
spring:
  application:
    name: spring-cloud-common
 
#注册中心指向start    
eureka:
#  instance:
#    instance-id: spring-cloud-common
#    appname: ${spring.application.name}
  client: 
    service-url: 
      defaultZone: http://admin:1234@127.0.0.1:8888/eureka/
#注册中心指向end

在编写一个controller层

@RestController
public class DemoController {

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

    @GetMapping("/demo")
    public String demo(@RequestParam(value = "name", defaultValue = "小毅毅") String name) {
        return "name:" + name + " ,端口:" + port;
    }
}

这里配置文件的端口为8001,我们启动一次后,端口修改成8002在启动一次,那么就会注册上2个服务了。

如何启动2次代码呢?

点击:

feign配置负载均衡 配置文件 feign负载均衡策略_feign_02

feign配置负载均衡 配置文件 feign负载均衡策略_feign_03

---------------------------------------------------这样生产者就写好了------------------------------------------

 

四、现在是最关键的消费者,使用feign实现的负载均衡

关键的maven依赖注意,多添加一个这个

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

然后是启动类:

@SpringBootApplication
//@EnableEurekaClient //Eureka 客户端
@EnableDiscoveryClient
@EnableFeignClients //开启Feign的功能
public class CrudMain {
    public static void main(String[] args) {
        new SpringApplicationBuilder(CrudMain.class).web(true).run(args);
    }
}

application.yml配置文件:

server:
  port: 8010
spring:
  application:
    name: spring-cloud-crud
 
#注册中心指向start    
eureka:
  instance:
    instance-id: spring-cloud-crud
    appname: ${spring.application.name}
  client: 
    service-url: 
      defaultZone: http://admin:1234@127.0.0.1:8888/eureka/
#注册中心指向end

关键地方,接口的编写,我这里为了省事,就一个类里面把所有代码都写上

@RestController
public class TestController {
//    @Autowired
//    private RestTemplate restTemplate;
    @Autowired
    Feign feign;  //依赖注入的接口
//    private static final String MALL_CRUD_USERS_URL = "http://spring-cloud-common/";

    @GetMapping("/getCommon")
    public String getCommon(@RequestParam String name) {
        System.out.println("调用服务开始---------");
//        String s = restTemplate.getForObject(MALL_CRUD_USERS_URL+"demo?name="+name, String.class);
        String s=feign.feignDemo(name);
        System.out.println("调用服务结束---------调用取得的值为:"+s);
        return s;
    }
}

/*
* 这个接口就是为了调用别的服务
* */
@Service
@FeignClient(value = "spring-cloud-common")  //Feign会根据注解上的value值找到具体的服务名,然后再根据接口上的Mapping找到当前服务对应的接口
interface Feign{
    @GetMapping("/demo")    //这里的路径和生产者的路径一致,所以才能对应上
    String feignDemo(@RequestParam(value = "name") String name);
}

------------------------------------------消费者完成--------------------------------------------------------

 

接下来系统测试:

按照顺序启动,首先是eureka服务端,由于开启了安全认证,所以登录后就能访问了,账号amdin,密码1234。配置文件都写了的。

feign配置负载均衡 配置文件 feign负载均衡策略_java_04

登录成功后,还没有服务注册:

feign配置负载均衡 配置文件 feign负载均衡策略_feign配置负载均衡 配置文件_05

然后服务端的启动顺序就不规定了,我这里先启动common这个包的,这个生产者得启动两次,启动第一次后修改端口启动第二次。两次都启动成功后如下图:

feign配置负载均衡 配置文件 feign负载均衡策略_java_06

注册成功,这时候启动消费者crud包

feign配置负载均衡 配置文件 feign负载均衡策略_负载均衡_07

成功启动成所有项目。。这个时候进行测试:

浏览器输入:http://localhost:8010/getCommon?name=小毅毅

feign配置负载均衡 配置文件 feign负载均衡策略_feign_08

feign配置负载均衡 配置文件 feign负载均衡策略_Spring cloud_09

feign配置负载均衡 配置文件 feign负载均衡策略_java_10

成功实现负载均衡--------------