SpringCloud

一、服务注册中心1、Eureka1.1父工程pom文件

<groupId>com.lun</groupId><artifactId>LearnCloud</artifactId><version>1.0.0-SNAPSHOT</version><packaging>pom</packaging><!– 这里添加,注意不是jar或war –><!– 统一管理jar包版本 –><properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <lombok.version>1.16.18</lombok.version> <mysql.version>5.1.47</mysql.version> <druid.version>1.1.16</druid.version> <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version></properties><!– 子模块继承之后,提供作用: 锁定版本+子modlue不用写groupId和version –><dependencyManagement> <dependencies> <!–spring boot 2.2.2–> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!–spring cloud Hoxton.SR1–> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <!–spring cloud alibaba 2.1.0.RELEASE–> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.spring.boot.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <optional>true</optional> </dependency> </dependencies></dependencyManagement><build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins></build>

1.2EurekaServer服务端安装

<!– eureka新旧版本 –><!– 以前的老版本(2018)–><dependency> <groupid>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId></dependency><!– 现在新版本(2020.2)–><!– 我们使用最新的 –><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>

1)pom依赖文件

<artifactId>cloud-eureka-server7001</artifactId><dependencies> <!–eureka-server–> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!–boot web actuator–> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!–一般通用配置–> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency></dependencies>

2)application.yml文件

server: port: 7001eureka: instance: hostname: locathost #eureka服务端的实例名称 client: #false表示不向注册中心注册自己。 register-with-eureka: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 fetch-registry: false service-url: #设置与Eureka server交互的地址查询服务和注册服务都需要依赖这个地址。 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3)主启动

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication@EnableEurekaServerpublic class EurekaMain7001 { public static void main(String[] args) { SpringApplication.run(EurekaMain7001.class, args); }}

4).测试运行??EurekaMain7001???,浏览器输入??http://localhost:7001/??回车,会查看到Spring Eureka服务主页。

1.3服务提供者注册进EurekaServer

1)pom文件

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

2)application.yml

eureka: client: #表示是否将自己注册进Eurekaserver默认为true。 register-with-eureka: true #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡 fetchRegistry: true service-url: defaultZone: http://localhost:7001/eurekaspring: application: name: cloud-payment-service

3)主启动

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication@EnableEurekaClient//<—–添加该注解public class PaymentMain001 { public static void main(String[] args) { SpringApplication.run(PaymentMain001.class, args); }}

1.4服务消费者

1).POM

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

2).yml

server: port: 80spring: application: name: cloud-order-serviceeureka: client: #表示是否将自己注册进Eurekaserver默认为true。 register-with-eureka: true #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡 fetchRegistry: true service-url: defaultZone: http://localhost:7001/eureka

3).主启动

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication@EnableEurekaClient//<— 添加该标签public class OrderMain80{ public static void main( String[] args ){ SpringApplication.run(OrderMain80.class, args); }}

1.5.测试

1).启动cloud-provider-payment8001、cloud-eureka-server7001和cloud-consumer-order80这三工程。

2).浏览器输入 http://localhost:7001 , 在主页的Instances currently registered with Eureka将会看到cloud-provider-payment8001、cloud-consumer-order80两个工程名。

3).注意,application.yml配置中层次缩进和空格,两者不能少,否则,会抛出异常Failed to bind properties under ‘eureka.client.service-url’ to java.util.Map <java.lang.String, java.lang.String>。

1.6Eureka集群配置

1).修改cloud-eureka-server7001的Eureka服务器配置文件

server: port: 7001eureka: instance: hostname: eureka7001.com #eureka服务端的实例名称 client: register-with-eureka: false #false表示不向注册中心注册自己。 fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 service-url: #集群指向其它eureka defaultZone: http://eureka7002.com:7002/eureka/ #单机就是7001自己 #defaultZone: http://eureka7001.com:7001/eureka/

2).修改cloud-eureka-server7002的Eureka服务器配置文件

server: port: 7002eureka: instance: hostname: eureka7002.com #eureka服务端的实例名称 client: register-with-eureka: false #false表示不向注册中心注册自己。 fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 service-url: #集群指向其它eureka defaultZone: http://eureka7001.com:7001/eureka/ #单机就是7002自己 #defaultZone: http://eureka7002.com:7002/eureka/

3).服务提供者,服务消费者

eureka: client: #表示是否将自己注册进Eurekaserver默认为true。 register-with-eureka: true #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡 fetchRegistry: true service-url: defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka

1.7Eureka自我保护理论知识

概述:Eureka服务端会检查最近15分钟内所有Eureka 实例正常心跳占比,如果低于85%就会触发自我保护机制。触发了保护机制,Eureka将暂时把这些失效的服务保护起来,不让其过期,但这些服务也并不是永远不会过期。Eureka在启动完成后,每隔60秒会检查一次服务健康状态,如果这些被保护起来失效的服务过一段时间后(默认90秒)还是没有恢复,就会把这些服务剔除。如果在此期间服务恢复了并且实例心跳占比高于85%时,就会自动关闭自我保护机制。

一句话:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。

2、Consul

Consul是一套开源的分布式服务发现和配置管理系统。

能干嘛?

服务发现 – 提供HTTP和DNS两种发现方式。健康监测 – 支持多种方式,HTTP、TCP、Docker、Shell脚本定制化KV存储 – Key、Value的存储方式多数据中心 – Consul支持多数据中心可视化Web界面

依赖

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

2.1服务提供者

yml文件

###consul服务端口号server: port: 8006spring: application: name: consul-provider-payment####consul注册中心地址 cloud: consul: host: localhost port: 8500 discovery: #hostname: 127.0.0.1 service-name: ${spring.application.name}

主启动类加上@EnableDiscoveryClient

2.2服务消费者

yml文件

###consul服务端口号server: port: 80spring: application: name: cloud-consumer-order####consul注册中心地址 cloud: consul: host: localhost port: 8500 discovery: #hostname: 127.0.0.1 service-name: ${spring.application.name}

主启动类加上@EnableDiscoveryClient

3、注册中心异同点(Eureka、consul、zookeeper)

组件名

语言CAP

服务健康检查

对外暴露接口

Spring Cloud集成

Eureka

Java

AP

可配支持

HTTP

Consul

Go

CP

支持

HTTP/DNS

Zookeeper

Java

CP

支持客户端

已集成

CAP:

C:Consistency (强一致性)A:Availability (可用性)P:Partition tolerance (分区容错性)

二、Ribbon负载均衡1.1概念

1)Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。主要功能是提供客户端的软件负载均衡算法和服务调用。

2)LB负载均衡(Load Balance)是什么

简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高可用)。

3)Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。

Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术

1.2系统默认规则实现负载均衡

支付服务提供者8001集群环境构建

参考8001服务提供者

1).新建8002服务提供者

2).改POM

3).写YML:改端口8002,8002服务提供者的服务名称(spring.application.name)与8001的一致

spring: application: name: cloud-service-comsunmer

4).主启动

5).业务类

@RestController@Slf4jpublic class PaymentController{ @Value(“${server.port}”) private String serverPort;//添加serverPort @PostMapping(value = “/payment/create”) public CommonResult create(@RequestBody Payment payment) { int result = paymentService.create(payment); log.info(“*****插入结果:” + result); if(result > 0) { return new CommonResult(200,”插入数据库成功,serverPort: “+serverPort/*添加到此处*/, result); }else{ return new CommonResult(444,”插入数据库失败”,null); } }}

6).负载均衡

80服务消费者访问地址不能写死

@Slf4j@RestControllerpublic class OrderController { //public static final String PAYMENT_URL = “http://localhost:8001”; public static final String PAYMENT_URL = “http://CLOUD-PAYMENT-SERVICE”; …}

7).使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

?import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configurationpublic class ApplicationContextConfig { @Bean @LoadBalanced//使用@LoadBalanced注解赋予RestTemplate负载均衡的能力 public RestTemplate getRestTemplate(){ return new RestTemplate(); }}

?

1.3Ribbon负载规则替换

1).修改cloud-consumer-order80

2).注意配置细节

官方文档明确给出了警告:

这个自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下,

否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了。

@SpringBootApplication包含了@ComponentScan,所以配置类不能在主启动所在的包下以及子包下。

3).新建package

4).在新建包下新建MySelfRule规则类

import com.netflix.loadbalancer.IRule;import com.netflix.loadbalancer.RandomRule;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class MySelfRule { @Bean public IRule myRule(){ return new RandomRule(); }}

5).主启动类添加@RibbonClient

import com.lun.myrule.MySelfRule;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.netflix.ribbon.RibbonClient;@SpringBootApplication@EnableEurekaClient//添加到此处@RibbonClient(name = “CLOUD-PAYMENT-SERVICE”, configuration = MySelfRule.class)public class OrderMain80{ public static void main( String[] args ){ SpringApplication.run(OrderMain80.class, args); }}

6).使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

?

?

?

?

世俗的纷扰,生活的琐碎使人精疲力尽,

SpringCloud

相关文章:

你感兴趣的文章:

标签云: