Eureka==============
Eureka Server 注册中心
Eureka介绍:
1、Eureka Server是服务端,负责管理各各微服务结点的信息和状态。
2、在微服务上部署Eureka Client程序,远程访问Eureka Server将自己注册在Eureka Server。
3、微服务需要调用另一个微服务时从Eureka Server中获取服务调用地址,进行远程调用。
单机Eureka的搭建:
1.在SpringCloud父工程中导入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
2.在Eureka Server工程中导入Eureka依赖
<parent>
<artifactId>xc-framework-parent</artifactId>
<groupId>com.xuecheng</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../xc-framework-parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
3.在Eureka Server工程中配置启动类
@EnableEurekaServer
@SpringBootApplication
public class GovernCenterApplication{
SpringApplicaiton.run(GovernCenterApplication.class);
}
4.在Eureka Server工程中配置applicaiton.yml
server:
port: ${PORT:50101} #服务端口
spring:
application:
name: edu-govern-center #指定服务名
eureka:
client:
registerWithEureka: true #服务注册,是否将自己注册到Eureka服务中
fetchRegistry: true #服务发现,是否从Eureka中获取注册信息
serviceUrl: #Eureka客户端与Eureka服务端的交互地址,高可用状态配置对方的地址,单机状态配置自己(如果不配置则默认本机8761端口)
defaultZone: ${EUREKA_SERVER:http://eureka02:50102/eureka/}
server:
enable-self-preservation: false #是否开启自我保护模式,开发环境下建议关闭
eviction-interval-timer-in-ms: 60000 #服务注册表清理间隔(单位毫秒,默认是60*1000)
instance:
hostname: ${EUREKA_DOMAIN:eureka01}
tip:
1.server:
port: ${PORT:50101} 表示如果对PORT赋值,就使用赋的值,没有就使用50101,相当于Freemarker中的!'默认值'
2.Eureka Server有一种自我保护模式,当微服务不再向Eureka Server上报状态,Eureka Server会从服务列表将此
服务删除,如果出现网络异常情况(微服务正常),此时Eureka server进入自保护模式,不再将微服务从服务列
表删除。在开发阶段建议关闭自保护模式。
高可用Eureka的搭建(Eureka集群):
两台Eureka Server互相注册即可实现Eureka高可用。
修改单机的server.port eureka.client.serviceUrl.defaultZone instance.hostname
实现方式:
在IDEA下制作启动脚本,配置jvm启动参数
VM options:
eureka01: -DPORT=50101 -DEUREKA_SERVER=http://eureka02:50102/eureka/ -DEUREKA_DOMAIN=eureka01
eureka02: -DPORT=50102 -DEUREKA_SERVER=http://eureka01:50101/eureka/ -DEUREKA_DOMAIN=eureka02
@EnableDiscoverClient
Eureka Client在注册中心注册服务
1.在服务工程添加依赖
<!-- 导入Eureka客户端的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.在服务工程启动类上加@EnableDiscoverClient注解
@EnableDiscoverClient
@SpringBootApplication
public class CmsApplicaiton{
SpringApplication.run(CmsApplicaiton.class);
}
3.配置服务工程的application.yml
eureka:
client:
registerWithEureka: true #服务注册开关
fetchRegistry: true #服务发现开关
serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址,多个中间用逗号分隔
defaultZone: ${EUREKA_SERVER:http://localhost:50101/eureka/,http://localhost:50102/eureka/}
instance:
prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
ip-address: ${IP_ADDRESS:127.0.0.1}
instance-id: ${spring.application.name}:${server.port} #指定实例id
=Feign===================
Feign远程调用
Feign远程调用的前提,消费者和生产者都是Eureka Client
1.工作流程
每个Eureka Client都在Eureka Server中注册自己的信息;当一个Eureka Client1需要访问Eureka Client2时,从Eureka Server中获取Eureka Client2的IP地址,Eureka Client1通过远程调用(Http Client)的方式调用Eureka Client2
2.客户端负载均衡
Ribbon是Netflix公司开源的一个负载均衡的项目(https://github.com/Netflix/ribbon),它是一个基于HTTP、TCP的客户端负载均衡器。负载均衡算法是由客户端自己完成的
远程调用方案一:
Ribbon + RestTemplate
1.在消费者(服务调用方)导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
2.配置RestTemplate(SpringMVC提供了RestTemplate来发送远程请求,但是需要注入实现类),在引导类中添加:
@Bean
@LoadBanlanced
public RestTemplate restTemplate(){
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
3.在application.yml中添加ribbon配置
ribbon:
MaxAutoRetries: 2 #最大重试次数,当Eureka中可以找到服务,但是服务连不上时将会重试
MaxAutoRetriesNextServer: 3 #切换实例的重试次数
OkToRetryOnAllOperations: false #对所有操作请求都进行重试,如果是get则可以,如果是post,put等操作没有实现幂等的情况下是很危险的,所以设置为false
ConnectTimeout: 5000 #请求连接的超时时间
ReadTimeout: 6000 #请求处理的超时时间
4.远程调用测试
@Autowired
private RestTemplate restTemplate;
@Test
public void testFindOne(){
String server = "SERVICE-CMS";
String url = "http://"+server+"/cms/page";
restTemplate.getForEntity(url,Map.class);
}
远程调用方案二:
Feign,Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http客户端,Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用。
1.在消费者(服务调用方)导入依赖,(删除方案一的依赖)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
2.在消费者(服务调用方)定义FeignClient接口,参考swagger-ui接口
@FeignClient(value = "SERVICE-CMS")
public interface CmsPageClient{
@GetMapping("/cms/page/get/{id}")
public CmsPage findCmsPageById(@PathVariable("id") String id);
@PostMapping("/cms/page/save")
public CmsPageResult saveCmsPage(@RequestBody CmsPage cmsPage);
.....
}
3.在引导类上加@EnableFeignClients注解
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public ...
4.Eureka Client会自动生成代理对象,进行ribbon负载均衡,并发送远程调用请求,得到数据,所以直接在需要使用到服务的地方@Autowired FeignClient即可
SpringCloud对Feign进行了增强兼容了SpringMVC的注解 ,我们在使用SpringMVC的注解时需要注意:
1、feignClient接口 有参数在参数必须加@PathVariable("XXX")和@RequestParam("XXX")
2、feignClient返回值为复杂对象时其类型必须有无参构造函数。