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
发现获取的数据有时用户的姓名为张三,有时为李四。