01_Eureka & Nacos

*三种微服务技术

 

*springcloud和springboot的版本对应

一、RestTemplate + Eureka + Nacos

1.注入RestTemplate

通过bean注入到spring容器中,在要用的时候装配出来使用

String url = "http://localhost:8081/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);

发送get请求获取接口数据

getForObject(url, User.class)

第一个参数是请求地址,第二个参数可以设置返回的类型,自动讲json转换成对象

2.Eureka注册中心

微服务启动时自动向Eureka注册自己的信息

消费者需要接口时向Eureka拿信息

没30s服务都会向Eureka发送心跳,告诉Eureka还活着,防止单机

搭建eureka服务

①导依赖

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

②写配置文件

设置服务名

设置服务信息

server:
  port: 10086 #服务端口
spring:
  application:
    name: eurekaserver
eureka:
  client:
    service-url:   #eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

③启动服务

eureka服务注册

①导入依赖

<!--eureka客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

②配置信息

配置服务名

配置服务信息

spring:
  application:
    name: eurekaserver
eureka:
  client:
    service-url:   #eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

配置多个实例

可以复制服务的配置,来创建多个服务,但是需要添加参数 -Dserver.port=8082 来设置端口,防止端口冲突

3.Eureka服务发现-拉取服务

1.用服务名代替ip端口

old:
    String url = "http://localhost:8081/user/" + order.getUserId();
new
    String url = "http://userservice/user/" + order.getUserId();
​

2.配置负载均衡

在RestTemplate上添加配置 @LoadBalanced

@Bean
@LoadBalanced
public RestTemplate restTemplate(){
    return new RestTemplate();
}

负载均衡

由Ribbon完成负载均衡

当发送请求时,ribbon拦截请求,并向eureka拉去服务列表,在根据列表做负载均衡

ribbon原理:

底层负载均衡的逻辑定义在IRule中,由IRule的子类决定是什么子类

想要修改默认的规则,两种方式:

第一种,只需要往容器中注入一个IRule的bean就可以修改默认的规则

例如修改规则为随机

@Bean
public IRule RandomRule(){
    return  new RandomRule();
}

第二种,则yml文件中针对服务名,指定修改其的负载均衡规则

userservice:
 ribbon:
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule  # 负载均衡规则

ribbon的默认流程为懒汉模式,在第一次要用服务时,才回去拉取,放到内存中,所以使得第一次请求的时间变长

可以修改其为饥饿加载,在服务启动时加载

在yml文件中加入配置

ribbon:
  eager-load:
    enabled: true # 开启饥饿加载
    clients: # 指定饥饿加载的服务名称
      - userservice

4.Nacos注册中心

默认端口8848

application.properties 中修改端口

启动

windows:

①进入到bin文件夹双击startup.cmd ( 不推荐 )

②用cmd窗口进入到bin文件夹

输入

startup.cmd -m standalone

linux:

在nacos/bin目录中,输入命令启动Nacos:

sh startup.sh -m standalone

依赖包

父工程:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

客户端:

<!-- nacos客户端依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

操作步骤:

( 不用单独创建一个模块,eureka要单独创建一个模块 )

①修改依赖包

包括父工程包和子工程包

②修改配置文件的配置信息

spring: 
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
      discovery:
        cluster-name: HZ    # 集群名称

可以配置集群信息,分集群管理,让拉取优先集群内部

但是需要修改负载均衡规则为NacosRule 集群内优先,在集群内随机

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡规则

考虑到设备性能不同,可能需要某些机器承担多一点

可以设置权重,来修改访问的频率 权重值一般在0~1

环境隔离 - namespace

 

配置namespace

nacos中分为临时实例和非临时实例,默认 临时实例

可以在yml中添加配置,修改其为非临时实例

临时实例:

没有收到发送的呼吸之后,就当你挂了,之后会从列表中删除

非临时实例:

相比临时实例,nacos会发送请求询问其状态,没有收到呼吸之后,会一直等待,不会从列表中删除

5.Nacos实现配置管理

1 在Nacos添加配置

 

 

2 在项目中添加依赖和包

 

由于需要读取Nacos中的配置文件整合到项目中的配置问间中,然而又要读取了项目的配置文件才知道Nacos的信息

所以可以需要一个优先级更高的配置文件,单独存放Nacos的配置信息

热更新

方式一

需要在使用到配置文件内容的类中添加注解

@RefreshScope

@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${pattern.dateformat}")
    private String dateFormate;

    @GetMapping("/now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateFormate));
    }

方式二

专门新建一个Data类

添加 @ConfigurationProperties(prefix="pattern")

让 类中的成员变量 自动绑定到配置文件中的变量

在添加 @Component 把类注册到容器中

@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {

    private String dateformat;

}
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private PatternProperties patternProperties;

    @GetMapping("/now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }

会读取nacos中多个配置文件

先读取 服务名-环境名.后缀名 例如userservice-de.yaml

再读取 服务名.yaml 例如userservice.yaml

再读取 本地的配置文件

 

6. nacos的非临时实例配置

默认为临时实例,默认为true

spring:
  application:    #服务名
    name: userservice
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
      discovery:
        cluster-name: SH    # 集群名称
        ephemeral: true   #默认为true  即临时实例,改为false则设置为非临时实例

7.eureka和nacos区别

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值