Java——SpringCloud服务治理与负载均衡(二)

服务治理通过抽象将服务消费者和服务提供者进行隔离。

基于Cloud的服务治理有以下优点

  • 更高的可用性:服务消费者只需要知道服务名称就可以调用相应的服务,而不需要具体的物理地址。当服务实例不可用或者新上线时,治理服务器能及时的调用转发等。
  • 负载均衡:可以将所有请求动态地分布到其所管理的所有服务实例中进行。
  • 提升应用的弹性:治理客户端会定时缓存服务实例信息于本地,当治理服务器不可用时,服务消费者可读缓存获取信息。
  • 高可用性集群:可以构建服务治理集群,治理服务见相互注册,高可用。

服务治理的3个概念

  • 服务治理服务器(Eureka服务器):服务注册中心,负责服务列表的注册、维护和查询等功能。
  • 服务注册代理(服务提供者、Eureka客户端):可以通过服务注册代理将服务配置信息注册到治理服务器上。负责将微服务所提供的的服务向Eureka服务器执行注册、续约和注销等操作,以使服务消费者可以发现并进行消费。
  • 服务发现客户端(服务消费者、Eureka客户端):启动时默认会从所服务治理服务器中获取所有服务注册表信息,通过所获取到的服务注册列表信息来消费相应的服务。

往往一个服务消费者也是一个服务提供者。

Eureka服务器

添加pom.xml依赖:

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

添加注解:

@EnableEurekaServer

配置参数application.properties

spring.application.name=servicediscovery
# Eureka服务运行端口号
server.port=8761

eureka.instance.hostname=localhost
eureka.server.wait-time-in-ms-when-sync-empty=5
# 当SpringBoot启动服务完成后是否将该服务注册到服务治理服务器上
eureka.client.register-with-eureka=false
# 应用启动后是否需要从服务治理服务器中同步已注册的服务注册列表数据到本地
eureka.client.fetch-registry=false

服务注册

添加pom.xml依赖:

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

添加注解:

@EnableDiscoveryClient

配置参数application.properties

# 微服务运行端口号
server.port=12100
spring.application.name=userservice

eureka.instance.prefer-ip-address=true
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
# Eureka服务器地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

获取服务

添加pom.xml依赖:

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

添加注解到启动类:

@EnableDiscoveryClient

配置参数application.properties

# 微服务运行端口号
server.port=12200
spring.application.name=productservice

eureka.instance.prefer-ip-address=true
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
# Eureka服务器地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

可以选择使用RestTemplate方式,
启动类:

@EnableDiscoveryClient
@SpringBootApplication
public class Application {
    @Bean(value = "restTemplate")
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

注入服务接口类:

# 注入
@Autowired
@Qualifier(value = "restTemplate")
private RestTemplate restTemplate;
# 调用时    
UserDto userDto = this.restTemplate.getForEntity("http://USERSERVICE/users/{id}", UserDto.class, userId).getBody();

负载均衡

根据负载均衡所在位置不同,微服务架构中负载均衡解决方案主要有3种:

  • 集中式负载均衡:在服务消费者和提供者之间有一个独立的负载均衡系统(与传统单体架构原理一致)。
  • 进程内负载均衡:客户端负载均衡。在服务消费者应用中内置负载均衡器,需配合服务发现功能。——Ribbon
  • 主机独立负载均衡进程:在第二种基础上,将负载均衡和服务发现功能从服务消费者的进程内移出来,变成一个主机上的一个独立进程,为该主机上的一个或多个服务消费者提供负载均衡处理。

负载均衡Ribbon

只需修改服务消费者代码如下:
添加pom.xml依赖:

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

更改启动类:
通过注解@LoadBalanced,Ribbon为Rest客户端的实现增加了客户端负载均衡功能。
默认情况下,负载均衡采用轮询策略(RoundRobinRule)。

    @Bean(value = "restTemplate")
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

使用Feign简化微服务调用

Feign是一个声明式WebService客户端。Feign提供了HTTP请求模板,通过编写简单的接口并插入注解,就可以完成HTTP请求的参数、格式、地址等信息的声明。通过Feign代理HTTP请求,我们只需要像调用方法一样调用它就可以完成微服务请求以及相关处理。Feign整合了Ribbon和Hystrix。

Feign的使用

添加pom.xml依赖:

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

启动类注解:
其中,@EnableFeignClients有参数basePackages可以指定服务接口类Jar包位置,当服务接口类Jar和主应用类不在同一个包中时。

@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

新建一个服务接口类:
其中,@FeignClient注解的name属性为微服务名称。 @RequestMapping需要和微服务的路由一致。

@FeignClient("USERSERVICE")
public interface UserService {
    @RequestMapping(value = "/users", method = RequestMethod.GET)
    List<UserDto> findAll();

    @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
    UserDto load(@PathVariable("id") Long id);
}

调用接口类:

# 注入
@Autowired
private UserService userService;

#调用时
public UserDto loadUserByFeign(Long userId) {
        return this.userService.load(userId);
}

Eureka集群搭建

配置文件修改
例如共三台服务器,两两相互注册,其中sdpeer1的配置如下,另外两台类似:

spring.application.name=sdpeer1
server.port=8761

eureka.instance.hostname=sdpeer1
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://sdpeer2:8762/eureka,http://sdpeer3:8763/eureka

多网卡及IP指定

推荐在项目中使用IP地址而不是主机名称来注册微服务。

eureka.instance.prefer-ip-address=true
eureka.instance.ip-adress=192.168.1.12

负载均衡策略

  • 轮询策略 RoundRobinRule
  • 随机选择 RandomRule
  • 最大可用策略 BestAvailableRule
  • 带有加权的轮询策略 WeightedResponseTimeRule
  • 可用过滤策略 AvailabilityFilteringRule
  • 区域感知策略 ZoneAvoidanceRule

Feign绑定参数

使用@RequestParam @PathVariable @RequestHeader等注解时,其value值不可少,必须声明。@RequestBody对象必须要有默认构造函数。

Feign支持继承,可以简化开发,但是不建议这样做,这样会造成服务提供者与服务消费者之间代码紧耦合。

微服务健康监控

可以选择 Spring Actuator。
Actuator提供的对应用系统自身和监控的集成功能,包含了对应用系统进行配置查看、运行状态监控及相关功能统计等功能。监控统计数据通过REST端点方式暴露,并返回Json数据。使用时需添加依赖即可:

<dependencies>
      <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-actuator</artifactId>
       </dependency>
</dependencies>

可通过请求端点链接获取相应数据:
例如:GET请求 http://localhost:12100/health

Endpoint ID Description
/autoconfig 获取SpringBoot自动化配置机制所产生的自动化配置信息报告,包含了所有自动化配置的候选项及每个候选项自动化皮质条件是否满足等信息
/auditevents 显示应用暴露的审计事件 (比如认证进入、订单失败)
/beans 列出所有由SpringBoot创建Bean的配置列表
/configgroups 获取应用中配置的属性信息报告
/info 显示应用的基本信息,自定义属性配置信息
/health 显示应用的健康状态,包括应用是否启动、磁盘空间等
/metrics 显示应用多样的度量信息,比如CPU数量、内存信息、线程信息和垃圾回收信息等
/loggers 显示和修改配置的loggers
/logfile 返回log file中的内容(如果logging.file或者logging.path被设置)
/httptrace 显示HTTP足迹,最近100个HTTP request/repsponse
/env 显示当前的环境特性,包括环境变量、JVM属性、应用的配置、命令行中的参数等
/flyway 显示数据库迁移路径的详细信息
/liquidbase 显示Liquibase 数据库迁移的纤细信息
/shutdown 让你逐步关闭应用
/mappings 显示所有的@RequestMapping路径
/scheduledtasks 显示应用中的调度任务
/threaddump 执行一个线程dump
/heapdump 返回一个GZip压缩的JVM堆dump

如果不想使用shutdown端点,修改配置文件:

# 禁用/shutdown端点
endpoints.shutdown.enable=false
发布了23 篇原创文章 · 获赞 0 · 访问量 244
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览