springcloud实践

springcloud实践,第1张

1.创建父级maven工程          

        添加依赖(删除src文件)

    
    
        
            
            
                org.springframework.boot
                spring-boot-dependencies
                2.3.9.RELEASE
                pom
                import
            
            
                org.springframework.cloud
                spring-cloud-dependencies
                Hoxton.SR9
                pom
                import
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2.2.6.RELEASE
                pom
                import
            
        
    
    
    
        
            org.projectlombok
            lombok
            provided
        
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.jupiter
                    junit-jupiter-engine
                
            
        
        
    
    
    
        
            
                
                org.apache.maven.plugins
                maven-compiler-plugin
                3.8.1
                
                    8
                    8
                
            
        
    
2.在父级工程下创建子级maven工程provider1

        ①.子工程添加依赖

  

        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.projectlombok
            lombok
        

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        

        
            com.alibaba.cloud
            spring-cloud-alibaba-dependencies
        
    

        ②.配置生产者的yml文件 resources->application.yml

server:
  port: 8080 #端口号
spring:
  cloud:
    nacos:  #服务启动时会向nacos发送心跳包(5秒一次)
      discovery:  #服务的注册和发现
        server-addr: localhost:8848
      config: #配置管理功能
        server-addr: localhost:8848
        file-extension: yml
        namespace:
        group: DEV_GROUP_51
        shared-configs[0]: #共享配置,0代表下标
        refresh-enabled: true
  application:
    name: provider1  #服务名

3.启动nacos

                nacos下载及启动

4.生产者服务的注册与发现

        ①.nacos登录之后启动provider的启动项,然后点击nacos网页中服务管理菜单下的服务列表就可以看到注册的服务了,我更改端口后多启动了一次服务,所以实例数为2

5.创建消费者项目

与provider项目基本相同,只需要更改一下yml中端口号与服务名,然后启动消费者服务,在刷新nacos控制台,查看服务是否注册成功

6.创建provider和consumer的请求路径并进行服务之间的调用

        ①.provider创建controller对象

package com.practice.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

@RestController
@CrossOrigin
@RequestMapping("/provider1")
public class Pojo1Controller {
    @Value("${server.port:8080}")//
    private Integer port;
    @GetMapping("/get/{user}")
    public String get(@PathVariable("user")String s){
        return  "服务端口"+port+" say  hello to "  + s+"!" ;
    }
}

        ②.consumer模块利用RestTemplate对象通过url直接调用provider服务

package com.practice.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

@RestController
@CrossOrigin
@RequestMapping("/consumer1")
public class Consumer1Controller {
    //value 的内容直接在application.yml中配置
    // service:
    //  name: provider1
    //  url: "http://localhost:8080/provider1/get/"
    @Value("${service.name:prvider1}")
    private String provider ;
    @Value("${service.url}")//
    private String url;
    //直接通过RestTem对象调用服务
    @Autowired
    private RestTemplate restTemplate1;
    @GetMapping("/get/{user}")
    public String get(@PathVariable("user")String s){
//        String formatUrl = String.format(url+s);
        return restTemplate1.getForObject(url+s,String.class);
    }
}

        ③.重启provider和consumer的服务,然后在服务器访问consumer服务,consumer直接调用provider服务

 7.通过LoadBalancerClient对象(会自动进行负载均衡)获取服务对象,通过对象获取ip以及端口号
 //从注册中心获取服务然后访问
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @GetMapping("/getnacos/{user}")
    public String getnacos(@PathVariable("user")String s){
        ServiceInstance provider1 = loadBalancerClient.choose("provider1");//从注册中心获取服务
        String ip = provider1.getHost();//获取ip
        int port = provider1.getPort();//获取服务端口
        String url = String.format("http://%ip:%port/provider1/get/%s",ip,port,s);
        return restTemplate1.getForObject(url,String.class);
    }

8.采用feign方式对服务进行调用

        ①.provider模块添加pojo类用来接收consumer发过来的对象参数(如果传入providerde 请求参数不是用对象接收的可以不写)

package com.practice.pojo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.sql.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Consumer {
    private Integer id ;
    private String name ;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")//输出的时间的格式
    @DateTimeFormat(pattern = "yyyy-MM-dd")//接收的时间的格式
    private Date date;
}

        ②.prvider模块添加接收feign方法调用的接口

 @PostMapping("/testfeign")
    public Consumer test(@RequestBody Consumer pojo1){
        System.out.println(pojo1);
        pojo1.setId(pojo1.getId()+3);
        return pojo1;
    }

        ③.consumer启动项多添加两个注解

/*参数为@feignclient注解所在接口的包路径*/
@EnableFeignClients(basePackages = "com.practice.service")
@EnableDiscoveryClient

        ④.创建pojo类(如果传入consumer请求的参数不是用对象接收的可以不写)

package com.practice.pojo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.sql.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Consumer {
    private Integer id ;
    private String name ;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")//输出的时间的格式
    @DateTimeFormat(pattern = "yyyy-MM-dd")//接收的时间的格式
    private Date date;
}

        ⑤.创建controller层接收参数

package com.practice.controller;

import com.alibaba.fastjson.JSON;
import com.practice.pojo.Consumer;
import com.practice.service.Consumer1FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/consumer1")
public class ConsumerFeignController {
    @Autowired
    private Consumer1FeignService consumer1FeignService;//service层创建的用来调用服务的接口
    @PostMapping("/testfeign")
    public Consumer  testFeign(@RequestBody Consumer consumer){
        System.out.println(consumer);
        String string = JSON.toJSONString(consumer);
        Consumer consumer1 = consumer1FeignService.test(consumer);
        return consumer1;
    }
}

        ⑥.创建feign方法调用服务的接口

package com.practice.service;

import com.practice.pojo.Consumer;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * 定义用于实现远程provider服务调用的service接口
 *   其中:
 *  1)@FeignClient 用于描述远程服务调用接口
 *  2)name="sca-provider" 为你要远程调用的服务名
 *  3)contextId为当前bean的名称,假如没有指定contextId,默认会采用@FeignClient注解中name属性指定的名字作为bean的名字
 *  4)fallbackFactory用于定义服务调用超时等现象发生时,
 */
@FeignClient(name = "provider1")
public interface Consumer1FeignService {
    @PostMapping("/provider1/testfeign")//所调用的服务的接口格式
    Consumer  test(@RequestBody Consumer consumer);//括号里面为调用的服务接收参数的格式
}

        ⑦.重启两个服务之后利用前端对服务进行调用,此处使用的是postman,可以看到返回的数据时经过povider修改之后的数据

9.利用ncos配置中心对服务进行配置

        ①.在nacos界面点击:配置管理->配置列表->右边的+     之后会出现配置页面

        ②.data id 的配置格式:

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

        第一个参数是你的服务名字,第二个参数是服务运行的环境在yml中配置(没有配置可以不写),第三个参数是指定的配置文件的格式,都是可以在配置文件中配置的

server:
  port: 8090 #端口号
spring:
  application:
    name: consumer1  #服务名
  profiles:
    active: dev
  cloud:
    nacos:  #服务启动时会向nacos发送心跳包(5秒一次)
      discovery:  #服务的注册和发现
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml
        namespace:
#        group: DEV_GROUP_51
        shared-configs[0]: #共享配置,0代表下标
          data-id: consumer1-dev.yaml
          group: DEFAULT_GROUP
          refresh: true
        refresh-enabled: true

service:
  name: provider1
  url: "http://localhost:8080/provider1/get/"

        ③.然后这个配置的dataI id 就是:consumer1-dev.yaml,然后在配置内容当中写下需要更新的配置点击发布

         ④.将application.yml复制后改名为bootstrap.yml并清空application.yml

         ⑤.在consumer中创建获取配置的类

package com.practice.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/get")
@RestController
@RefreshScope//动态刷新
public class GetConsumerController {
    @Value("${service.testname}")
    private String serviceName;
    @GetMapping("/serviceName")
    public String get(){
        return  serviceName;
    }
}

        ⑥.重启consumer服务,输入网页进行查询:http://localhost:8090/get/serviceName

        ⑦.然后再去配置中心更改配置内容,点击发布,再次刷新网址,就会发现我们配置的属性已经更改了,此配置是程序yml中没有的数据

       ⑧.关于nacos覆盖本地配置:

spring中配置文件的加载顺序是bootstrap.yml早于application.yml,以及编译后的加载方式,所以如果想要nacos覆盖配置已有的配置,那么需要被覆盖的配置要写到application.yml中

        ⑨.nacos配置文件的本地存储地址

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/919841.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存