SpringCloud-Eureka和Feign

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		//声明当前类是Eureka Server的注册中心
@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发现客户端
Eureka Client在注册中心注册服务
1.在服务工程添加依赖
<!-- 导入Eureka客户端的依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2.在服务工程启动类上加@EnableDiscoverClient注解
@EnableDiscoverClient	//声明当前类是Eureka的客户端
@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	//bean的ID默认是方法名
//添加@LoadBalanced注解后,restTemplate会被LoadBalancerInterceptor拦截器拦截,并实现负载均衡算法,
@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";	//生产者在注册中心注册的spring.applicaiton.name,默认会自动大写
    String url = "http://"+server+"/cms/page";	//server-->localhost:31001
    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{
 	//根据页面id查询页面信息,远程调用cms请求数据
    @GetMapping("/cms/page/get/{id}")//用GetMapping标识远程调用的http的方法类型
    public CmsPage findCmsPageById(@PathVariable("id") String id);

    //添加页面,用于课程预览
    @PostMapping("/cms/page/save")
    public CmsPageResult saveCmsPage(@RequestBody CmsPage cmsPage);
    	.....
}

3.在引导类上加@EnableFeignClients注解
@EnableFeignClients //Spring会扫描标记了@FeignClient注解的接口,并生成此接口的代理对象
@EnableDiscoveryClient
@SpringBootApplication
public ...	//不再配置RestTemplate

4.Eureka Client会自动生成代理对象,进行ribbon负载均衡,并发送远程调用请求,得到数据,所以直接在需要使用到服务的地方@Autowired FeignClient即可

SpringCloud对Feign进行了增强兼容了SpringMVC的注解 ,我们在使用SpringMVC的注解时需要注意:
1、feignClient接口 有参数在参数必须加@PathVariable("XXX")@RequestParam("XXX")
2、feignClient返回值为复杂对象时其类型必须有无参构造函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值