【一】SpringCloud详细搭建--注册中心Eureka,Ribbon,feign【Finchley版本】
SpringCloud搭建【Finchley版本】
github源码下载:https://github.com/LuckyShawn/simple-spring-cloud
1.SpringCloud简介
-
SpringCloud,基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。
-
SpringCloud利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,SpringCloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等,它们都可以用SpringBoot的开发风格做到一键启动和部署。
-
SpringBoot并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过SpringBoot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包
总结:SpringCloud即分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的集合体,俗称微服务全家桶
2.开始搭建,第一步创建父工程
IDEA创建一个主Maven工程,在其pom.xml文件引入依赖如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.shawn</groupId> <artifactId>simple-spring-cloud</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>simple-spring-cloud</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.7.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <dependencies> <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>spri 20000 ng-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
此工程为父工程,之后的子工程继承自simple-spring-cloud父工程
3.创建服务注册中心Eureka
Eureka包含两个组件:Eureka Server和Eureka Client ,C/S模式(服务端和客户端)
- Eureka Server (server)提供服务注册和发现
- Service Provider(client)服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
- Service Consumer(client)服务消费方从Eureka获取注册服务列表,从而能够消费服务
- 开始创建Eureka Server:
注意:一定是点击simple-spring-cloud父工程右键创建新的Module
Next下一步,Finish完成!
创建完后的工程,其pom.xml继承了父pom文件,并引入spring-cloud-starter-netflix-eureka-server的依赖表明是一个Eureka服务端,xml新增如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
- 在Eureka-server主启动类中添加注解@EnableEurekaServer
@SpringBootApplication @EnableEurekaServer //EurekaServer服务器端启动类,接受其它微服务注册进来 public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
- 在eruake-server的resources下新建并编写application.yml
server: port: 8761 eureka: instance: hostname: localhost #eureka服务端的实例名称 client: register-with-eureka: false #false表示不向注册中心注册自己。 fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
- 启动eruake-server主启动类
打开浏览器访问:localhost:8761 出现一下注册中心界面,成功搭建好注册中心!
No instances available 说明没有服务在此注册中心注册
4.创建eureka-client客户端(服务提供者Service Provider)
- 步骤和服务端一样,组件选择Eureka Discovey如下图:
- pom.xml变动:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 新增并编写application.xml:
server: port: 8762 eureka: client: #客户端注册进eureka服务列表内 service-url: defaultZone: http://localhost:8761/eureka spring: application: name: eureka-client #这个很重要,服务间的调用标识都是根据这个name
- 主启动类添加注解:
@SpringBootApplication @EnableEurekaClient //本服务启动后会自动注册进eureka服务中 public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } }
- 测试是否成功
先要启动eureka-server 再启动eureka-client主启动类
访问localhost:8761注册中心,出现一下界面,说明注册成功!
补充:
注册中心出现这个是Eureka的自我保护现象,
某时刻某一个微服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存
5.创建服务消费者(Ribbon)
1.Ribbon简介
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。
负载均衡概念:
- 集中式LB:
即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方; - 进程内LB:
将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。
Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。
- 创建consumer-ribbon
pom.xml新增:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
- 新增并编写application.yml
server: port: 8764 spring: application: name: consumer-ribbon eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
- 修改eureka-client
新增一个controller提供hello服务
package com.shawn.eurekaclient.controller; //包位置 @RestController public class HelloController { @Value("${server.port}") String port; @GetMapping("/hello") public String hello(@RequestParam(value = "name",defaultValue = "shawn") String name){ return "Hello!!"+name+",I am from:"+port; } }
- 修改主启动类
package com.shawn.consumerribbon; @SpringBootApplication @EnableEurekaClient public class ConsumerRibbonApplication { public static void main(String[] args) { SpringApplication.run(ConsumerRibbonApplication.class, args); } @Bean //注入一个bean到ioc容器中 @LoadBalanced //开启负载均衡功能 public RestTemplate restTemplate(){ return new RestTemplate(); } }
- 编写HelloService类
通过容器中的restTemplate来消费eureka-client的“/hello”接口,在这里我们直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名
package com.shawn.consumerribbon.service; @Service public class HelloService { @Autowired private RestTemplate restTemplate; public String hello(String name){ return restTemplate.getForObject("http://eureka-client/hello?"+name,String.class); } }
7.编写HelloController
package com.shawn.consumerribbon.controller; @RestController public class HelloController { @Autowired private HelloService helloService; @GetMapping("/hello") public String hello(String name){ return helloService.hello(name); } }
- 启动注册中心eureka-server,分别启动两次eureka-client 端口为8762,8763(修改application.yml的port属性启动两次)最后启动consumer-ribbon 共4个服务如下图:
- 测试
多次访问:http://localhost:8764/hello?name=shawn
8762和8763来回切换,此为负载均衡的轮询算法
Hello!!shawn,I am from:8762 Hello!!shawn,I am from:8763
- 总结
服务注册中心:eureka-server,端口为8761
服务提供者:eureka-client,端口分别为8762,8763(小集群)分别向服务注册中心注册
服务消费者:consumer-ribbon,端口为8764,向服务注册中心注册
consumer-ribbon通过restTemplate调用eureka-client的hello接口时,因为用ribbon进行了负载均衡,会轮流的调用eureka-client:8762和8763 两个端口的hello接口
Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。
6.创建客户端Feign
- 概述
参考官网:http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign
Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
Feign能干什么
Feign旨在使编写Java Http客户端变得更容易。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon
利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用
- 开始创建consumer-feign
目前的结构:
pom.xml新增:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- 新增并编写application.yml
server: port: 8765 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ spring: application: name: consumer-feign
- 修改主启动类
@SpringBootApplication @EnableFeignClients //开启feign功能 @EnableEurekaClient //@EnableDiscoveryClient //若不是eureka注册中心 public class ConsumerFeignApplication { public static void main(String[] args) { SpringApplication.run(ConsumerFeignApplication.class, args); } }
- 编写FeignService接口
@FeignClient("eureka-client")////指定调用哪个服务 eureka-client为服务名 public interface FeignService { @RequestMapping(value = "/hello",method = RequestMethod.GET) String sayHello(@RequestParam(value = "name")String name); }
- 编写FeignController
@RestController public class FeignController { @Autowired private FeignService feignService; @GetMapping("/hello") public String sayHello(String name){ return feignService.sayHello(name); } }
- 启动consumer-feign,之前的8761,8762,8763,8764不要停止。
重复访问:http://localhost:8765/hello?name=shawn
服务提供者8762,8763不断切换,说明负载均衡起作用了。
Hello!!shawn,I am from:8762 Hello!!shawn,I am from:8763阅读更多
- SpringCloud学习:服务Server注册中心Eureka搭建
- springcloud之注册中心eureka 环境搭建
- (二)Eureka,注册中心,服务者,消费者(Ribbon,Feign)
- springCloud系列教程01:Eureka 注册中心集群搭建
- 使用SpringCloud搭建微服务<三>---------使用EureKa编写服务的注册中心
- springcloud微服务架构之搭建注册中心Eureka与注册中心的互相注册
- 注册中心 Eureka 源码解析 —— 调试环境搭建
- springcloud项目搭建(一):eureka注册中心
- SpringCloud(第 051 篇)EurekaServer集群高可用注册中心以及简单的安全认证
- springcloud(二):注册中心Eureka
- 【Spring Cloud】Eureka服务注册中心搭建
- 注册中心 Eureka 源码解析 —— 调试环境搭建
- [置顶] idea创建springcloud项目图文教程(EurekaServer注册中心)(六)
- 【Spring Cloud】Eureka服务注册中心搭建
- 注册中心 Eureka 源码解析 —— 调试环境搭建
- SpringCloud自学入门-服务注册中心搭建
- SpringCloud组件:搭建Eureka服务注册中心
- 【Spring Cloud】Eureka服务注册中心搭建
- 注册中心 Eureka 源码解析 —— 调试环境搭建
- SpringCloud (一)Eureka注册中心搭建