SpringCloud学习:Eureka、Feign(含示例代码)

一、Spring Cloud Netflix简介
SpringCloud是一个基于SpringBoot实现的云应用开发工具,它为基于JVM的云应用开发中的配置故那里、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了简单的开发方式。
SpringCloud下包含了多个工程,其中的Spring Cloud Netflix提供了一系列搭建微服务基础架构的功能组件。
Netflix的部分组件及功能特性如下:
Eureka(服务注册与发现框架):一个基于REST风格的服务组件,用于定位服务,以实现云端的负载均衡和中间层服务器的故障转移
Hystrix(服务容错组件):容错管理工具,旨在通过控制服务和第三方库的节点,从而对延迟和故障提供强大的容村能力
Zuul(服务网关):边缘服务工具,提供动态路由、监控、贪心、安全等边缘服务
Ribbon(客户端负载均衡器):提供客户端负载均衡算法,将Netflix的中间层服务连接起来
Feign(声明式HTTP客户端):可以创建声明式、模板化的HTTP客户端,进行微服务调用

二、Eureka(服务注册与发现框架)

1、服务注册与发现
在进行普通架构的应用开发时,如果服务端提供了一个REST API或者Thrift API的服务,客户端为了能完成一次服务请求,需要知道服务实例的网络位置(IP:Port)。传统架构的应用都是运行在物理硬件之上,服务实例的网络位置时相对固定的。
但是在微服务架构之下,一个微服务可能会在某一时刻进行销毁重建,或是伸缩漂移,这样一来服务实例的网络位置就变得不可预知。为了解决这一问题,我们需要在微服务架构中引入了服务注册与发现功能。
服务发现有如下两种模式:
a、客户端服务发现(Client-Side Discovery)

客户端负责决定可用的服务实例的网络地址,以及围绕他们的负载均衡。客户端向服务注册表发送一个请求,服务注册表是一个可用服务实例的数据库。客户端使用一个负载均衡算法,去选择一个可用的服务实例,来响应这个请求。
一个服务实例被启动,他的网络地址会被写到注册表上,当服务实例终止,会从注册表中删除。这个服务实例的注册表通过心跳机制动态刷新。

b、服务端服务发现(Server-Side Discovery)

客户端通过负载均衡器向某个服务提出请求,负载均衡器向服务注册表发出请求,将每个请求转发往可用的服务实例。和客户端发现一样,服务实例启动时在服务注册表中注册,当服务实例销毁,将会从服务注册表中进行删除。
客户端无需关注发现的细节,只需要简单的向负载均衡器发送请求,实际上减少了编程语言框架需要完成的服务发现逻辑。
缺点是,除非部署环境能够提供负载均衡,否则负载均衡器是另外一个需要配置管理的高可用系统功能。

2、Eureka介绍
Eureka是一种基于REST的服务,主要用于AWS云中的定位服务,以实现中间层服务器的负载均衡和故障转移。Eureka提供了基于Java的客户端组件,使得与服务的交互更容易。客户端还有一个内置的负载均衡器,用于执行基本的轮训负载均衡。
Eureka架构体系图如下:

Eureka Server实例作为服务注册中心的角色,负责接受来自Eureka Client的服务注册,并加以保存。
Eureka Client内嵌于一个微服务中,会将当前实例作为服务实例注册到服务注册中心(Eureka Server),注册内容包括IP、Port和服务实例名称。消费者同样内嵌了Eureka Client,在进行服务调用的时候,可以通过Eureka提供的DiscoveryClient和服务实例的名称,从服务注册中心(Eureka Server)获取服务实例列表,然后得到服务实例的IP和Port,以完成服务调用。

3、示例代码
a、Eureka Server(服务注册中心)
1)在IDE中创建一个Maven项目,然后在该项目的pom.xml文件中,添加以下依赖。
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent> <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build> <dependencies>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies> <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
2)在src/main/java包下创建EurekaRegistryDemo类,并使用@EnableEurekaServer和@SpringBootApplication注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaRegistryDemo 
{
    public static void main( String[] args )
    {
        SpringApplication.run(EurekaRegistryDemo.class, args);
    }
}
3)在src/main/resources包下创建application.yml配置文件
server:
  port: 8080 #当前应用端口
spring:
  application:
    name: eureka-registry #应用名称
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8080/eureka/ #Eureka Server地址
    register-with-eureka:
      false #因为自己是注册中心,所以不注册自己
    fetch-registry:
      false
  instance:
    metadataMap:
      instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
4)运行EurekaRegistryDemo.java,将会启动服务注册中心,访问地址为:localhost:8080

b、Eureka Client(服务提供者)
1)创建一个maven项目作为服务提供者,提供一个REST服务,并且通过Eureka Client,把服务实例注册到注册中心
项目pom.xml文件和上面Eureka Server相同。
2)在src/main/java包下创建以下java类
应用启动类:
@SpringBootApplication
@EnableEurekaClient
@EnableAutoConfiguration
public class EurekaClientDemo {

 public static void main(String[] args) {
  new SpringApplicationBuilder(EurekaClientDemo.class).web(true).run(args);
 }
}
REST服务接口:
public interface TestApi {
 @RequestMapping(value="/testhello/{name}", method=RequestMethod.GET)
 public String testHello(@PathVariable("name") String name);
}
REST服务实现类:
@RestController
public class TestControl implements TestApi {

 public String testHello(@PathVariable("name")String name) {
  return "Hello world,"+name;
 }

}
3)在src/main/resources包下创建配置文件application.properties
这里的配置文件使用了另外一种文件格式,如果使用Eureka Server相同的文件格式也是可以的。
server.port=9090
spring.application.name=eureka.client
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/
eureka.instance.appname=eureka.client.01
4)启动  EurekaClientDemo类,刷新注册中心页面,将会看到服务提供者实例已经注册到注册中心,并且可以直接在浏览器访问该实例暴露出来的REST服务

三、Feign(服务消费者)
Feign可以创建声明式、模板化的HTTP客户端,进行微服务调用。接下来我们将会使用Feign和Eureka Client编写一个服务消费者,从Eureka Server中查询到服务提供实例的调用地址,并完成服务调用。
1、创建maven项目,pom.xml文件中的依赖配置如下:
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent> <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties> <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build> <dependencies>

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency> <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies> <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
2、创建应用程序启动类FeginApplication,并且添加@SpringBootApplication和@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient

public class FeginApplication {
 
 
 public static void main(String[] args) {
  SpringApplication.run(FeginApplication.class, args);
 }

}
3、创建一个REST服务实现类,在实现类中使用Eureka提供的DiscoveryClient类,通过服务提供者实例的名称从注册中心中查询服务提供者实例的具体地址,然后使用Feign进行服务调用。在这里需要使用到服务提供者的REST服务接口,生成代理,进行服务调用,所以需要依赖服务提供者的服务接口。在服务提供者项目中将接口导出成jar,然后给当前项目依赖就可以。
@RestController
public class TestService {

    private TestApi computeClient;
    
    private static final String SERVER_NAME = "eureka.client";

 @Autowired
 private DiscoveryClient discoveryClient;
 
 @RequestMapping(value = "/gethello/{name}", method = RequestMethod.GET)
    public String getHello(@PathVariable("name") String name) {
  
  Builder feignBuilder= Feign.builder().decoder(new ResponseEntityDecoder(new SpringDecoder(new ObjectFactory<HttpMessageConverters>(){
   public HttpMessageConverters getObject() throws BeansException {
    return new HttpMessageConverters();
   }
  }))).client(new ApacheHttpClient()).contract(new SpringMvcContract());
  computeClient = feignBuilder.target(TestApi.class,discoveryClient.getInstances(SERVER_NAME).get(0).getUri().toString());
        return computeClient.testHello(name);
    }
}
代码说明:
a、discoveryClient.getInstances(SERVER_NAME).get(0).getUri().toString()
通过discoveryClient,从服务注册中心中,获取名为SERVER_NAME,即“eureka.client”的服务实例列表。因为当前只有一个服务提供者,所以直接取列表中的第一个实例的地址信息。
b、Feign默认的decoder需要在被调用的服务接口上添加@RequestLine(“GET /test/{name}”)才能被正常调用。在这里为了能直接支持@RequestMapping注解,所以构造Feign的时候添加了devoder,没有使用默认的
c、代码中没有使用默认的FeignClient进行调用,而是替换成了ApacheHttpClient

4、在src/main/resources包下,创建配置文件application.properties
server.port=7070
spring.application.name=eureka.test
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/
eureka.instance.appname=eureka.test.01
5、启动应用后,可以在服务注册中心页面中看到服务消费者实例也注册到了注册中心里,此时在浏览器访问localhost:7070/gethello/aaa可以测试服务调用功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
Spring Cloud是基于Spring框架的一套微服务开发工具集。它提供了一系列的工具来帮助开发者快速构建分布式系统,包括配置管理、服务发现、负载均衡、断路器、消息总线、分布式数据存储等功能。 Spring Cloud的核心组件包括: 1. Eureka:服务发现和注册中心,用于管理服务的注册、发现和负载均衡。 2. Ribbon:客户端负载均衡器,用于在客户端上实现负载均衡。 3. Feign:客户端HTTP请求工具,用于简化HTTP请求的编写。 4. Hystrix:断路器,用于实现服务的熔断和降级。 5. Zuul:API网关,用于路由、过滤和负载均衡。 6. Config:配置中心,用于管理应用程序的配置信息。 以下是一个简单的Spring Cloud示例,它演示了如何使用Eureka、Ribbon和Feign构建一个基本的微服务应用程序。 1. 创建一个Spring Boot项目,添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 2. 在application.properties文件中添加以下配置: ``` spring.application.name=example-service eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka ``` 3. 创建一个RESTful API接口: ``` @RestController @RequestMapping("/example") public class ExampleController { @Autowired private ExampleService exampleService; @GetMapping("/{id}") public Example getById(@PathVariable Long id) { return exampleService.getById(id); } } ``` 4. 创建一个服务接口: ``` @FeignClient(name = "example-service") public interface ExampleService { @GetMapping("/example/{id}") Example getById(@PathVariable Long id); } ``` 5. 在启动类上添加@EnableDiscoveryClient注解,启用服务发现功能: ``` @SpringBootApplication @EnableDiscoveryClient public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 6. 启动Eureka Server,并将服务注册到Eureka中。 7. 启动多个示例应用程序,它们将自动注册到Eureka中,并使用Ribbon和Feign进行负载均衡和HTTP请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值