鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 编程语言开发 > java > >

SpringCloud

来源:互联网 作者:佚名 时间:2022-07-19 11:29
一、服务注册中心 1、Eureka 1.1父工程pom文件 groupIdcom.lun/groupId artifactIdLearnCloud/artifactId version1.0.0-SNAPSHOT/version packagingpom/packaging!-- 这里添加,注意不是jar或war -- !-- 统一管理jar包版本 --

一、服务注册中心

1、Eureka

1.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: 7001


eureka:

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

@EnableEurekaServer

public 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/eureka

spring:
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: 80

spring:
application:
name: cloud-order-service

eureka:
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: 7001


eureka:

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: 7002


eureka:

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: 8006

spring:
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: 80

spring:
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

@Slf4j

public 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

@RestController

public 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;


@Configuration

public 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;


@Configuration

public 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负载均衡的能力

?

?

?

?

上一篇:Java之多线程技术
下一篇:没有了
网友评论
<