Spring Cloud创建服务提供者跟消费者并使用负载均衡

  Eureka是一个很好的注册中心,接下来创建服务提供者以及消费者的工程,并通过Eureka注册中心进行服务器注册。如果不知道怎么建立注册中心的请参考另外一篇文章【Spring Cloud 入门程序,集成Eureka】  完成注册工程的建立

1、创建一个Spring-Cloud-Provider的服务提供者工程,在yml文件中加入:

server:
  host: localhost
  port: 8762
spring:
  application:
    name: provider-service
eurekaServer:
  host: localhost  #注册中心的地址
  port: 8000       #注册中心服务端的端口号
  user: martin     #注册中心安全校验用户名
  password: 123456 #注册中心安全校验密码
eureka:
  client:
    register-with-eureka: true #将此项目注册到Eureka服务
    service-url:
      defaultZone: http://${eurekaServer.user}:${eurekaServer.password}@${eurekaServer.host}:${eurekaServer.port}/eureka

2、然后再在SpringCloudProviderApplication启动类中增加一个注解:@EnableEurekaClient标示此项目是Eureka客户端。

3、测试服务提供者的服务是否已经注册到Eureka注册中心,首先先启动spring-cloud-eurake注册中心,再启动Spring-Cloud-Provider项目。

idea如何启动多实例工程:

点击Application再点击添加项目:

发现启动服务提供者程序时报错:

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

因为2.0默认开启了csrf,如果我们现在直接启动Eureka服务的话客户端是注册不上的,所以需要把csrf关闭。

在Eureka注册中心的工程中新建WebSecurityConfigurer类:

package com.person.common;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @author: Martin
 * @Date: 2018/10/29
 * @Description:
 * @Modify By:
 */
@EnableWebSecurity
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        super.configure(http);
    }
}

  然后重新启动注册中心以及服务提供者这两个工程(注意先后顺序,先启注册中心再起服务),访问127.0.0.1:8761,可以看到服务已经注册到了注册中心。

  这个时候你发现Eureka 的首页面出现了一段红色的话,第一感觉是不是报错,有错误了(程序员日常启动项目或者做需求一看到报红就很慌(心里xxxxxxxx)),莫慌,其实这段话并不是程序出错了,因为我们在配置注册中心的时候设置了

enable-self-preservation: true 开启了自我保护的机制。

4、Eureka的自我保护模式

如果在Eureka Server的首页看到以下这段提示,则说明Eureka已经进入了保护模式。

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。

5、接下来为了测试负载均衡,创建多一个跟Spring-Cloud-Provider一模一样的项目工程作为第二个服务的提供者。命名为Spring-Cloud-Provider2

注意只修改port端口就行,其他的不要修改(这里我用的是8763端口)

然后启动Spring-Cloud-Provider2工程,在Eureka 的注册界面能看到出现了以下截图的信息:

下面创建一个Spring-Cloud-Customer的消费者工程

在yml中加入:

server:
  host: localhost
  port: 8744
spring:
  application:
    name: customer-service
eurekaServer:
  host: localhost  #注册中心的地址
  port: 8000       #注册中心服务端的端口号
  user: martin     #注册中心安全校验用户名
  password: 123456 #注册中心安全校验密码
eureka:
  client:
    register-with-eureka: true #将此项目注册到Eureka服务
    service-url:
      defaultZone: http://${eurekaServer.user}:${eurekaServer.password}@${eurekaServer.host}:${eurekaServer.port}/eureka

创建这三个类:

AvoidLoanbalanced :

package com.person.customer.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 功能描述: 避免包扫描的类
 *
 * @author Martin
 * @version V1.0
 * @date 2018/10/29
 */

@Configuration
@ExcludeFromComponentScan
public class AvoidLoanbalanced {
    @Bean
    public IRule ribbonRule() {
        /**轮训*/
        return new RoundRobinRule();
        // return new WeightedResponseTimeRule();    //加权权重
        //return new RetryRule();                    //带有重试机制的轮训
        //return new RandomRule();                   //随机
        //return new TestRule();                     //自定义规则
    }
}

ExcludeFromComponentScan :

package com.person.customer.config;
//避免包扫描的注解
public @interface ExcludeFromComponentScan {
}

LoadBalanced :

package com.person.customer.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 功能描述: 负载均衡策略
 *
 * @author Martin
 * @version V1.0
 * @date 2018/10/29
 */
@Configuration
public class LoadBalanced {
    @Bean
    public IRule ribbonRule() {
        /**轮训*/
        return new RoundRobinRule();
        // return new WeightedResponseTimeRule();    //加权权重
        //return new RetryRule();                    //带有重试机制的轮训
        //return new RandomRule();                   //随机
        //return new TestRule();                     //自定义规则
    }
}

依次启动4个项目,进行测试http://127.0.0.1:8744/user/getUserInfo/1

发现获取的数据有时用户的姓名为张三,有时为李四。

猜你喜欢

转载自blog.csdn.net/qq_756589808/article/details/83540969
今日推荐