您现在的位置是:主页 > news > 哪个地方可学习网站建设/苏州seo整站优化

哪个地方可学习网站建设/苏州seo整站优化

admin2025/6/20 13:18:03news

简介哪个地方可学习网站建设,苏州seo整站优化,做食物网站,做室内设计兼职的网站​在上一篇《深入浅出Spring Cloud系列》:Spring Cloud Config (1) - 构建配置中心服务器​mp.weixin.qq.com中,我们已经构建了配置中心服务器,并为一个名为account-service的服务添加了配置信息。本文将介绍在account-service服务的代码中&a…

哪个地方可学习网站建设,苏州seo整站优化,做食物网站,做室内设计兼职的网站​在上一篇《深入浅出Spring Cloud系列》:Spring Cloud Config (1) - 构建配置中心服务器​mp.weixin.qq.com中,我们已经构建了配置中心服务器,并为一个名为account-service的服务添加了配置信息。本文将介绍在account-service服务的代码中&a…

96aafc905d0df0f9c0d7344b495bade9.png

​在上一篇

《深入浅出Spring Cloud系列》:Spring Cloud Config (1) - 构建配置中心服务器​mp.weixin.qq.com
a09c71d25cd3e8227544bb1d63cb4f35.png

中,我们已经构建了配置中心服务器,并为一个名为account-service的服务添加了配置信息。

本文将介绍在account-service服务的代码中,如何从远程配置服务器中获取配置信息,并使用配置信息。

首先,看看上一篇中为account-service服务添加的配置信息内容。

以下是account-service.yml的内容:

spring.jpa.database: "MYSQL"
spring.datasource.platform: "org.hibernate.dialect.MySQL55Dialect"
spring.jpa.show_sql: "true"
spring.database.driverClassName: "com.mysql.jdbc.Driver"
spring.datasource.url: "jdbc:mysql://localhost:3306/msproject?useUnicode=yes&characterEncoding=UTF-8"
spring.datasource.username: "msproject"
spring.datasource.password: "msproject"
spring.datasource.testWhileIdle: "true"
spring.jpa.hibernate.ddl-auto: "update"
spring.jpa.properties.hibernate.dialect: "org.hibernate.dialect.MySQL55Dialect"config.vendor: "yglong.com"
config.accountType.default: "administrator"

可以看到,主要配置了访问MySQL数据库相关的配置信息,还有最后两个额外的配置项,我们将使用这两个配置项,来演示如何在服务中引用它们。

1. 创建account-service服务

创建一个新工程,名为account-service,它是一个常规的Spring Boot工程,提供账户服务。

我们在其pom.xml中引入将要使用的依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.longyg</groupId><artifactId>account-service</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>account-service</name><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.10.RELEASE</version><relativePath /></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!-- 访问config server 的客户端实现 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.6.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-spatial</artifactId><version>5.2.12.Final</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.18</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Greenwich.SR3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.1.10.RELEASE</version></plugin></plugins></build>
</project>

其中,一个重要的依赖是spring-cloud-config-client,它包含了访问配置服务器的客户端实现。

我们还引入了JPA,Hibernete和MySQL驱动的依赖包,用于访问数据库,实现从数据库中查询,创建和删除账户的功能。

接下来,编写一个表示账户的Account实体类(@Entity注解),同时也将其映射到数据库account表(@Table注解)。如下:

package com.longyg.account.model;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name = "account")
public class Account {@Id@Column(name = "account_id", nullable = false)private String accountId;@Column(name = "account_name", nullable = false)private String accountName;@Column(name = "password", nullable = false)private String password;@Column(name = "account_type")private String accountType;public String getAccountId() {return accountId;}public void setAccountId(String accountId) {this.accountId = accountId;}public String getAccountName() {return accountName;}public void setAccountName(String accountName) {this.accountName = accountName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAccountType() {return accountType;}public void setAccountType(String accountType) {this.accountType = accountType;}
}

然后编写继承CrudRepository的AccountRepository接口,提供CRUD功能。如下:

package com.longyg.account.repository;import com.longyg.account.model.Account;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;@Repository
public interface AccountRepository extends CrudRepository<Account, String> {Account findByAccountId(String accountId);
}

我们再额外编写一个ServiceConfig类,它是一个配置类(使用Spring的@Configuration注解),我们将在这个类中注入配置信息。如下:

package com.longyg.account.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;@Configuration
public class ServiceConfig {@Value("${config.vendor}")private String vendor;@Value("${config.accountType.default}")private String accountType;public String getVendor() {return vendor;}public void setVendor(String vendor) {this.vendor = vendor;}public String getAccountType() {return accountType;}public void setAccountType(String accountType) {this.accountType = accountType;}
}

可以看到,我们使用了@Value注解,用${config.vendor}这样的格式,注入了配置文件里的config.vendor项。

类似地,${config.accountType.default}注入了配置文件里的config.accountType.default项。

接下来,编写一个AccountService的服务类(@Service注解),提供几个业务逻辑方法,如下:

package com.longyg.account.services;import com.longyg.account.config.ServiceConfig;
import com.longyg.account.model.Account;
import com.longyg.account.repository.AccountRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.UUID;@Service
public class AccountService {@Autowiredprivate AccountRepository accountRepository;@Autowiredprivate ServiceConfig config;public Iterable<Account> getAccounts() {return accountRepository.findAll();}public Account getAccount(String accountId) {Account account = accountRepository.findByAccountId(accountId);return account;}public void saveAccount(Account account) {account.setAccountId(UUID.randomUUID().toString());account.setAccountType(config.getAccountType());accountRepository.save(account);}public void deleteAccount(String accountId) {accountRepository.deleteById(accountId);}public String getVendor() {return config.getVendor();}
}

使用依赖注入(@Autowired注解)注入了AccountRepository和ServiceConfig。

使用AccountRepository提供的方法操作数据库,使用ServiceConfig提供的方法来调取配置信息。

接下来,编写控制器,提供外部访问的服务端点。如下:

package com.longyg.account.controllers;import com.longyg.account.model.Account;
import com.longyg.account.services.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping(value = "/v1/account")
public class AccountController {@Autowiredprivate AccountService accountService;@RequestMapping(method = RequestMethod.GET)public Iterable<Account> getAccounts() {return accountService.getAccounts();}@RequestMapping(value = "/{accountId}", method = RequestMethod.GET)public Account getAccount(@PathVariable("accountId") String accountId) {return accountService.getAccount(accountId);}@RequestMapping(method = RequestMethod.POST)public void createAccount(@RequestBody Account account) {accountService.saveAccount(account);}@RequestMapping(value = "/{accountId}", method = RequestMethod.DELETE)public void deleteAccount(@PathVariable String accountId) {accountService.deleteAccount(accountId);}@RequestMapping(value = "/vendor", method = RequestMethod.GET)public String getVendor() {return accountService.getVendor();}
}

我们主要编写了查询,创建和删除账户的服务端点。同时注入了AccountService,来完成实际的查询,创建和删除账户的业务逻辑。

另外,/v1/account/vendor服务端点仅用于演示能否正确引用配置文件里的配置信息。

最后,别忘了编写Spring的启动类。如下:

package com.longyg.account;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

2. 从配置服务器获取配置信息

至此,account-service服务的Java代码已经完成。

但我们还差一步:引入配置信息。包括连接数据库相关的配置信息,以及ServiceConfig类里引用的两个配置项。

与传统的Spring Boot项目不一样的是,这些配置并不与项目代码放在一起,而我们将从上一节实现的集中式的配置中心服务器中获取。

那么如何从配置服务器获取它们呢?

Spring Cloud为我们提供了非常方便的方法,只需简单的几行配置即可。

在src/main/resources下创建一个bootstrap.yml文件,编写如下几行配置:

spring:application:name: account-serviceprofiles:active: defaultcloud:config:uri: http://localhost:8889

Ok,配置完成,就这么简单。

spring.cloud.config.uri:指定访问配置服务器的uri。

spring.application.name:指定应用的名称。

spring.profiles.active:指定使用哪个profile。

在pom.xml中引入的spring-cloud-config-client包含了Spring Cloud Config的客户端实现,它将作为客户端,使用上面的配置构建URL,然后向配置服务器发起Get请求。

如上面的配置,构建的URL为:

http://localhost:8889/account-service/default

因此,要成功访问配置信息,要注意几点:

首先应用名称必须与配置服务器上的应用名称一致。

其次,如果profiles是default,将获取account-service.yml里的内容,如果profiles是dev,将获取account-service-dev.yml的配置信息。

但注意,访问非default的配置时,服务器始终会将default的配置一同返回,作为缺省项的默认值。例如,假如在dev配置文件中缺少spring.datasource.username配置项,那么程序将使用default里的同名配置项。

3. 测试服务

至此,所有代码已经开发完毕,我们来测试一下服务。

但注意,在启动account-service之前,先要启动上一节实现的配置服务器。

打开一个终端,进入config-server目录,运行命令:

mvn spring-boot:run

然后新开一个终端,进入account-service目录,运行命令:

mvn spring-boot:run

启动成功后,用postman测试服务是否可以正常使用。

首先,我们向http://localhost:8082/v1/account发一个POST请求,创建账户,postman截图如下:

a0493c1c0c4b81d639b647be863ef1a0.png

Body中选择raw,并设置为JSON格式,在文本框中输入要提交的JSON。

Send成功后,下方状态条将显示Status: 200 OK。

注意,在Send之前,要记得在Headers中添加Content-Type为application/json,否则请求不会成功。如下:

99c7ac4e5870d6285c2173dc037383f2.png

我们可以多发几个POST请求,多创建几个账户。然后向http://localhost:8082/v1/account发一个GET请求,获取所有账户信息。postman截图如下:

2dbb48f16e77bf91ffded7a0691ee9c9.png

可以看到,我们获取到了刚刚创建的所有账户。而且accountType的值也是期望的,它是我们通过配置文件里的config.accountType.default配置项注入程序的。

我们还可以测试一下http://localhost:8082/v1/account/vendor端点,验证是否可以获取配置文件中的config.vendor项。如下:

0c2b906c3d8e769a722f4b9339620e29.png

可以看到,成功获取,且与配置文件中的值是一致的。

接下来,我们还可以验证一下服务提供的其他端点,如删除账户,这里我就不再赘述了。

4. 总结

本文详细介绍了从无到有开发一个微服务,然后介绍了如何从远端配置服务器获取配置信息,并将获取的配置信息注入到服务代码中,供微服务程序使用。

有了配置中心服务器,我们可以让所有微服务的配置信息由配置服务器集中式的来管理。而不用将配置信息与服务代码绑定在一起,避免在修改配置信息后重新编译和部署服务的麻烦。

而当配置信息有更新时,只需要在运行时刷新配置信息就可以了。下一节将介绍当配置信息变化时,如何在不重启服务的情况下,刷新配置信息。

(完)

a427d628447ea2baad8795e2d2a3e9e1.png