分布式(微服务)项目拆分之注册中心、服务消费者、服务提供者的相关配置
注意事项
整个过程中要注意导包、版本、JDK是否有添加等问题
操作步骤
注册中心:Eureka(服务注册于发现的框架),是SpringCloud Netflix的一部分,整个过程中要注意导包、版本、JDK是否有添加等问题
- SpringCloud是基于SpringBoot的,所以先要创建一个SpringBoot项目:demo_eureka(注册中心)并打开(其垂直拆分的项目一起打开,放在一个文件夹里面)。
- 将注册中心demo_eureka的pom.xml文件添加到Maven Project中管理,然后开始配置注册中心:
- 导包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
//-------------------------------------------------------------------------------
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 添加配置;
在注册中心的application.properties文件中添加配置
// ## 给项目在spring容器中命名,可以自定义名称。此name会显示在注册中心上
spring.application.name=eureka-server
//## 注册中心的端口号(就是Tomcat的端口),因为注册中心也是一台服务器
server.port=8761
//## 此配置表示注册到eureka注册中心,但是我们目前配置的就是eureka本身,所以不需要注册到eureka,所以值为false。
//## false表示不注册到eureka
//## 此两项配置设为false,表示当前服务是一个注册中心(如果是true就不是注册中心)
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
//## 注册中心的地址(后面的服务都在这个地址上注册)
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
以上就是注册中心配置完成
6. 然后开始配置注册中心的启动类:在类上加上@EnableEurekaServer注解
// EnableEurekaServer注解表示将当前项目作为注册中心启动
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
配置完成后启动注册中心,输入注册中心地址http://localhost:8761(在上面配置中的地址)然后可以进到注册中心页面(画面不做展示,自行配置查看了解)
注册中心启动后,接下来就是将服务消费者服务提供者注册到注册中心
先配置服务提供者
7.将上面的服务注册中心demo复制一份,改名demo_provider1,并将pom.xml里面的名字也改下,同理服务消费者demo_client1
8. 服务提供者配置:
在注册中心配置的基础上进行修改,去掉两个false配置,再将端口改下,避免重复,在修改name名称,这个名称会显示到注册中心, 方便识别(尽量唯一且易识别),注册中心的地址不要进行修改,服务提供者需要将服务注册到注册中心
添加配置(在服务提供者的application.properties文件中添加配置)
//## 给项目在spring容器中命名,可以自定义名称。此name会显示在注册中心上
spring.application.name=provider1
//## 注册中心的端口号(就是Tomcat的端口),因为注册中心也是一台服务器
server.port=8762
//## 注册中心的地址(后面的服务都在这个地址上注册)
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
然后开始配置服务提供者的启动类:在类上加上@EnableEurekaClient注解(EnableEurekaClient表示服务提供者)
// EnableEurekaClient表示服务提供者
@EnableEurekaClient
@SpringBootApplication
public class Provider1Application {
public static void main(String[] args) {
SpringApplication.run(Provider1Application.class, args);
}
}
那么问题来了,服务提供者提供什么服务?
提供数据。
配置controller层,此时的controller层是一般的controller,表面上是一模一样,实际上和是不一样的,不一样在于它的调用方式比较特别,不是通过浏览器调用,而是通过一个应用调用另一个应用(正常情况下,一个项目里面的controller层想调用另外一个项目里面的controller层是实现不了的),现在要实现的是项目之间的controller层的调用,比较复杂,表面上一模一样,实际核心有很大的区别(至于区别,这里不做阐述)。
/**
* 由于SpringCloud是基于REST架构进行数据传输的。所以必须是RestController
*/
@RestController
@RequestMapping("/provide1")
public class ProviderController {
@RequestMapping("/name")
public String queryName(){
System.out.println("----服务提供者----");
return "zhangsan";
}
}
配置完成后,启动服务提供者,检查是否注册到注册中心,如若没有,要自行排查问题。
那么服务提供者有了,接下来就是服务消费者。
9. 服务消费者:
服务消费者需要额外导一个包(服务消费者和服务提供者不一样,他需要额外到一个包:ribbon)
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
导完包以后接下来就是进行一个配置:(同理类似服务提供者一样修改)
添加配置(在服务消费者的application.properties文件中添加配置)
//## 给项目在spring容器中命名,可以自定义名称。此name会显示在注册中心上
spring.application.name=client1
//## 注册中心的端口号(就是Tomcat的端口),因为注册中心也是一台服务器
server.port=8763
//## 注册中心的地址(后面的服务都在这个地址上注册)
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
端口号和name都要修改,注册中心地址不需要修改。
然后开始配置服务消费者的启动类:在类上加上@EnableDiscoveryClient注解(EnableDiscoveryClient表示服务消费者)
// EnableDiscoveryClient允许发现服务提供者
@EnableDiscoveryClient
@SpringBootApplication
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
启动类配置好了以后,接下来配置controller层,此时消费者的controller层不一定要是Rest风格,为了统一不出问题,也配置RestController风格。服务消费者消费的是服务提供者的数据,所以这里需要借助于工具,此时需要额外添加一个包configuration,新建一个SpringConfiguration类,并加上@Configuration注解!
@Configuration
public class SpringConfiguration {
/**
* RestTemplate 是一个远程访问RestController提供的接口的工具类
* @return
*/
@Bean//标签对应的必定是一个生成对象的方法,将这个方法(第三方包或工具类)交由Spring进行管理
@LoadBalanced //负载均衡
public RestTemplate providerRestTemplate(){
return new RestTemplate();
}
}
这个RestTemplate工具类是SpringBoot提供的一个工具类,用来调用别的服务器上的Rest接口的一个类。
@Bean标签对应的必定是一个生成对象的方法,将这个方法(第三方包或工具类)交由Spring进行管理
接下里完成controller层的代码:
@RestController
@RequestMapping("/client1")
public class ClientController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/name")
public String queryName(){
//restTemplate.getForObject(URI url , Class<T> responseType)
String name = restTemplate.getForObject("http://provider1/provide1/name",String.class);
System.out.println("--服务器消费者--");
System.out.println(name);
return name;
}
}
restTemplate.getForObject(URI url , Class responseType)由于服务者提供的返回类型是一个String类型,所以里使用String类型,那么地址URI url (http://provider1/provide1/name ) 是服务提供者的地址,那么这个地址又是怎么得到的呢?
服务消费者需要找到服务提供者提供的数据来消费,那么首先需要定位服务提供者,通过在注册中心查找到服务提供者注册name(provider1)来找到服务提供者,在通过服务提供者来找到对应的controller层(provide1),在controller层里面找到对应的方法(name),通过地址拼接得到具体地址来访问数据!
启动服务消费者,访问注册中心 http://localhost:8761 查看服务消费者是否也有注册上去(没有自行排查异常)
然后直接访问服务消费者方法 http://localhost:8763/client1/name ,可以查看到从服务提供者获取到的并有服务消费者返回的数据。
上一篇: 2021-03-18
下一篇: 6.2 APP的签名与打包