码迷,mamicode.com
首页 > 编程语言 > 详细

springcloud(一)-Eureka&Ribbon

时间:2020-12-14 12:59:04      阅读:4      评论:0      收藏:0      [点我收藏+]

标签:接口   指定   run   ota   client   wired   sel   new   根据   

架构演变
远程服务调用方式
Eureka
Ribbon


## 架构演变(了解)

集中式

特点:所有功能代码都在一个项目中
应用场景:访问量不太大的小项目
优点:开发、部署比较简单方便
缺点:修改代码,需要对整个项目进行打包部署,相对比较麻烦


垂直拆分

特点:根据功能把项目拆分成一个个单独的系统,系统之间不进行数据交互
应用场景:访问量稍微有点大,一个项目单独承载不了(中型项目)
优点:相对于集中来说,承载的访问量跟多;系统间相互独立可以采用不同的开发语言。
缺点:代码冗余、代码复用性比较低


分布式

特点:根据功能把项目拆分成一个个单独的系统,系统之间进行数据交互
应用场景:访问量稍微有点大,一个项目单独承载不了(大中型项目)
优点:相对于集中来说,承载的访问量跟多;系统间相互独立可以采用不同的开发语言;代码冗余度降低;
缺点:服务间调用关系比较杂乱


SOA

特点:根据功能把项目拆分成一个个单独的系统,系统之间进行数据交互
应用场景:访问量稍微有点大,一个项目单独承载不了(大型项目)
优点:相对于集中来说,承载的访问量跟多;系统间相互独立可以采用不同的开发语言;代码冗余度降低;有服务治理工 具,服务间调用关系比较清晰
缺点:一个系统对外提供多种服务,调用不清晰


微服务

特点:根据功能把项目拆分成一个个单独的系统,每个系统提供单一服务,系统之间进行数据交互
应用场景:访问量稍微有点大,一个项目单独承载不了(特大项目)
优点:相对于集中来说,承载的访问量更多;系统间相互独立可以采用不同的开发语言;代码冗余度降低;有服务治理工 具,服务间调用关系比较清晰;一个系统对外提供一种服务;耦合度低。
缺点:系统太多,占用服务器比较多,调用关系比较复杂,部署比较麻烦


总结:分布式、SOA、微服务都是“分布式架构”。

## 服务远程调用方式

webservice远程服务调用(了解)

cxf、axis:基于soap

hessian:基于hessian协议

dubbo(dubbox) Fegin:dubbo RPC协议,Feign http协议


RestTemplate

```tex
spring内置Http请求对象,可以在项目中直接使用@Autowired注入使用,也可以切换底层实现:
	HttpClient
	OkHttp
	JDK原生的URLConnection(默认的)

SpringCloud

概念:基于springBoot的,微服务框架集大成者

所有springCloud工程(直接、间接)都要导入如下坐标:

<!--继承springBoot-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
</parent>
<!--springCloud版本管理-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Eureka

概念:SpringCloud核心组件,默认的注册中心(Consul、Nacos)

作用:注册中心,服务注册、发现(注意:既不提供服也不消费服务)

角色:Eureka服务端(注册中心)、Eureka客户端(服务提供者、服务消费者)

技术图片

Eureka服务端

搭建步骤:

1)导入起步依赖

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

2)配置(配置文件、配置类)

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      # eureka 服务地址:
      #单机版:指定自己地址接口
      #集群版:需要指定其它集群eureka地址,有几个写几个,以逗号分隔即可
      defaultZone: http://127.0.0.1:10086/eureka
    # 默认true:单机版,不注册自己false;集群版,注册自己,使用默认值true即可
    register-with-eureka: false
    # 默认true:单机版,不拉取服务false;集群版,拉取服务,使用默认值true即可
    fetch-registry: false
  server:
    # 服务失效剔除时间间隔,默认60秒
    eviction-interval-timer-in-ms: 60000
    # 关闭自我保护模式(默认是打开的)
    enable-self-preservation: false

3)代码

package com.itheima;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer//声明当前应用为Eureka服务端(注册中心)
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

注意:如果依照上述操作出现Eureka-Server启动后自动停止,导入如下依赖即可:

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

Eureka客户端

1)导入起步依赖

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

2)配置

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka #注册中心地址,如果集群,有几个写几个,逗号分隔
  instance:
    # 更倾向使用ip地址,而不是host名
    prefer-ip-address: true
    # ip地址
    ip-address: 127.0.0.1  #默认0.0.0.0.0.0.1
    # 续约间隔,默认30秒
    lease-renewal-interval-in-seconds: 5
    # 服务失效时间,默认90秒
    lease-expiration-duration-in-seconds: 5

3)代码

package com.itheima.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan("com.itheima.user.mapper")
//@EnableDiscoveryClient //开启Eureka、zookeeper、consul客户端发现功能
@EnableEurekaClient //声明当前工程为Eureka Client,开启Eureka客户端发现功能
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

Consul

概念:基于Go语言,多数据中心、高可用、分布式注册中心

作用:服务注册、服务发现

使用步骤

准备工作:搭建consul注册中心

1)导入起步依赖

<!--consul 客户端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2)配置

#配置consul注册中心地址
server:
  port: 8000
spring:
  cloud:
    consul:
      host: localhost # consul 服务端的 ip
      port: 8500 # consul 服务端的端口 默认8500
      discovery:
        service-name: ${spring.application.name} # 当前应用注册到consul的名称
        prefer-ip-address: true # 注册ip
  application:
    name: consul-provider # 应用名称

3)代码

//在引导类添consul服务注册发现注解@EnableDiscoveryClient
@EnableDiscoveryClient(老师给的代码没加此注解,可以不加,都建议加上)
@SpringBootApplication
public class ConsulApplicatioin{
    
    public static void main(String[] args) {
		SpringApplication.run(ConsulApplicatioin.class, args);
	}
}

Nacos

概念:阿里开源的高可用、高性能注册中心和配置中心;

? Nacos = Spring Cloud注册中心 + Spring Cloud配置中心

作用:服务注册、发现;集中管理配置。

使用步骤

准备工作:搭建nacos注册中心

1)导入起步依赖

<!--nacos-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>0.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2)配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr:  127.0.0.1:8848 # 配置nacos 服务端地址
  application:
    name: nacos-provider # 服务名称

3)代码

//在引导类添Nacos服务注册发现注解@EnableDiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class NacosApplicatioin{
    public static void main(String[] args) {
		SpringApplication.run(NacosApplicatioin.class, args);
	}
}

Ribbon

概念:SpringCloud组件,负载均衡器

作用:负载均衡

负载均衡分类:服务端、客户端负载均衡。区分依据,服务地址列表在服务端还是在客户端
举例:服务端负载均衡nginx;客户端负载均衡ribbon。
负载均衡:在集群中,根据服务器性能不同,分配对应的负载(请求数)
例:
	User-Service         1000请求
	A 8G User-Service  250  1
	B 8G User-Service  250  1
	C 16G User-Service 500  2

负载均衡算法:轮询(默认)、随机、加权、hash

策略(底层在IRule接口中找实现类)

使用步骤:

1)导包

<!--Ribbon依赖包-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--‘eureka-client‘、‘openfeign‘内置了ribbon依赖包-->

2)配置

#ribbon相关配置,没有特殊要求可以省略,使用默认值即可

3)代码

@LoadBalanced //添加到执行远程调用的Http客户上
@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}

源码跟踪(能断点查看即可)

1)LoadBalancerInterceptor拦截请求,根据请求URI获取serviceID(源码大概:第31行)
2)RibbonLoadBalancerClient执行请求时,根据serviceID从Eureka注册中心获取服务列表,使用负载均衡算法从服务列表中,获取一个服务地址,发送请求(源码大概:第64行)

通用Mapper使用

概念:mybatis一个插件,对单表SQL进行了封装

作用:提供了对单表的CRUD操作

使用步骤:

1)导入起步依赖

<!--通用Mapper起步依赖-->
<dependency>
	<groupId>tk.mybatis</groupId>
	<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<!--实体类和表做映射需要使用:@Table(name = "tb_user")、@Id-->
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
    <version>1.0</version>
    <scope>compile</scope>
</dependency>

2)配置

#使用默认配置即可,可以省略

3)代码

实体类

package com.itheima.user.pojo;

import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Data
@Table(name = "tb_user")
public class User{
    // id
    @Id
    //开启主键自动回填
    @KeySql(useGeneratedKeys = true)
    private Long id;
    // 用户名
    private String userName;
    // 密码
    private String password;
    // 姓名
    private String name;
    // 年龄
    private Integer age;
    // 性别,1男性,2女性
    private Integer sex;
    // 出生日期
    private Date birthday;
    // 创建时间
    private Date created;
    // 更新时间
    private Date updated;
    // 备注
    private String note;
}

接口

public interface UserMapper extends Mapper<User>{}

引导类

package com.itheima.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan("com.itheima.user.mapper") //该注解来自tkMapper,导包时要注意
@EnableDiscoveryClient //开启Eureka客户端发现功能
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

springBoot回顾

概念

是一种快速使用spring的方式

核心

自动装配:约定大于配置,有默认配置。简化配置文件书写
起步依赖:基于maven依赖传递实现。简化依赖包管理

优点

1)自动装配,简化配置文件书写
2)起步依赖,简化依赖包管理
3)非功能性增强:监控、日志...
4)嵌入式服务器,项目启动更加方便

使用步骤

1)导包

<!--继承springBoot-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
</parent>

2)配置

#springboot配置:配置文件(.properties、yml)、配置类(@Configuration)
#application.yml
spring:
	application:
		name: springboot-project
server:
	port: 8080

3)代码

//引导类
@SpringbootApplication
public class XxxxApplication{
    
    public static void main(String[] args){
        SpringApplication.run(XxxxApplication.class,args);
    }
}

扩展内容

1)所有远程交互所使用的的pojo都要实现序列化接口(Serializable)
2)实体类书写规范
	1.如果有有有参构造,一定要声明无参构造(反射要用无参构造)
	2.见名知意(包名、类名、属性名、方法名)

springcloud(一)-Eureka&Ribbon

标签:接口   指定   run   ota   client   wired   sel   new   根据   

原文地址:https://www.cnblogs.com/zhang-blog/p/14100577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!