欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

分布式(微服务)项目拆分之注册中心、服务消费者、服务提供者的相关配置

程序员文章站 2024-03-22 18:16:52
...

分布式(微服务)项目拆分之注册中心、服务消费者、服务提供者的相关配置

注意事项

整个过程中要注意导包、版本、JDK是否有添加等问题

操作步骤

注册中心:Eureka(服务注册于发现的框架),是SpringCloud Netflix的一部分,整个过程中要注意导包、版本、JDK是否有添加等问题

  1. SpringCloud是基于SpringBoot的,所以先要创建一个SpringBoot项目:demo_eureka(注册中心)并打开(其垂直拆分的项目一起打开,放在一个文件夹里面)。
  2. 将注册中心demo_eureka的pom.xml文件添加到Maven Project中管理,然后开始配置注册中心:
  3. 导包
   <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>

  1. 添加配置;
    在注册中心的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 ,可以查看到从服务提供者获取到的并有服务消费者返回的数据。