添加依赖(删除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
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配置文件的本地存储地址
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)